项目中在web.xml中配置OpenSessionInViewFilter。而applicationContext的加载方式我使用的是struts的plugin方式配置ServiceLocator,通过ServiceLocator.getInstance().getBean()方式取得bean.这里就有问题了,OpenSessionInViewFilter是setAttribute()一个context,而我并没有使用spring的Action的支持获取Context,而是通过ServiceLocator中的factory = new ClassPathXmlApplicationContext(fn);方式加载context,这时OpenSessionInViewFilter会管理session吗?也就是说OpenSessionInViewFilter会生效吗?我的lazy暂时是fasle。
我的疑惑在,如果我调用getSession(),spring是否真的不会管理session,是否需要手动关闭。若真需要手动关闭,那问题就有了,我显示的使用this.closeSessionIfNecessary(session);关才SESSION,为什么提示session is closed,是spring container在管理session吗?
具体spring事务配置如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${hibernate.connection.driver_class}</value>
</property>
<property name="url">
<value>${hibernate.connection.url}</value>
</property>
<property name="username">
<value>${hibernate.connection.username}</value>
</property>
<property name="password">
<value>${hibernate.connection.password}</value>
</property>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="configLocation">
<value>classpath:hibernate.duty.xml</value>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="dyDutyConfigRuleDao"
class="com.boco.eoms.subsystem.duty.dao.impl.DyDutyConfigRuleDaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="dyDutyConfigRuleBO"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="dyDutyConfigRuleTarget" />
</property>
<property name="transactionAttributes">
<props>
<prop key="addDyDutyDateConfigRule">
PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
</prop>
<prop key="updateDyDutyDateConfigRule">
PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
</prop>
<prop key="addDyDutyDateConfigRuleByPeriods">
PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
</prop>
<prop key="updateDyDutyDateConfigRuleByPeriods">
PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-Exception
</prop>
</props>
</property>
</bean>
有时还会出现这个问题,在一个人登陆后,退出重新登陆时,就会出现如下错误。
00:42:22,302 ERROR JDBCExceptionReporter:38 - Cannot open connection
java.sql.SQLException: ORA-01017: invalid username/password; logon denied
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
at oracle.jdbc.ttc7.O3log.receive1st(O3log.java:407)
at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:259)
at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:346)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291)
多谢。祝好~~~~~~~~~