我使用struts + spring + ibatis制作一个小项目,作为练习用。但在使用数据库时出现“无法创建连接,因此无法开始事务”的错误(即使不使用事务也有类似“无法创建连接”的错误),异常信息摘录:
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver', cause: oracle.jdbc.driver.OracleDriverCaused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver', cause: oracle.jdbc.driver.OracleDriverCaused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver原来以为是oracle数据库的驱动没有安装正确,但是我已经反复确认,驱动应该没有问题。理由是下面几段代码都是可以正确运行的。(均在struts所需的execute方法中进行测试)
第一段:
Class.forName("oracle.jdbc.driver.OracleDriver");
运行后没有抛出ClassNotFoundException。
第二段:
oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver();
单步运行发现可以正确的实例化oracle.jdbc.driver.OracleDriver对象。
第三段:
oracle.jdbc.driver.OracleDriver testDriver = (oracle.jdbc.driver.OracleDriver)SpringUtils.getBean("testDriver");
其中SpringUtils.getBean是从Spring框架取得bean对象。
对应的spring配置为:
<bean id="testDriver" class="oracle.jdbc.driver.OracleDriver" />
单步运行发现可以正确的得到testDriver对象。请各位大虾帮忙分析一下原因。
以下是帮助分析的一些附加信息。操作系统:Windows XP SP2
JDK版本:1.4.2
开发环境:MyEclipse 5.1 GA
所使用的jar包列表:
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-fileupload.jar
commons-lang.jar
commons-logging.jar
commons-validator.jar
jakarta-oro.jar
struts-legacy.jar
struts.jar
spring.jar
ibatis-common-2.jar
ibatis-sqlmap-2.jar
ibatis-sqlmap.jar
classes12.jar我编写的相关的类大致有:
test.bean.RegisterFormBean -- struts所需要的form bean,传递数据用
test.action.RegisterAction -- struts所需要的action类,提供execute方法
test.service.UserService -- 接口,处理“用户”业务逻辑
test.service.UserServiceImpl -- 实现test.service.UserService接口
test.dao.UserDao -- 接口,处理“用户”数据
test.dao.UserDaoImpl -- 实现test.dao.UserDao接口,使用ibatis来操作数据库主要代码摘录:
test.action.RegisterAction的execute方法
UserService userService =
(UserService)SpringUtils.getBean("userService");
userService.register(registerFormBean);
return mapping.findForward("success");test.service.UserServiceImpl的register方法:
String p1 = registerFormBean.getPassword1();
String p2 = registerFormBean.getPassword2();
if( !p1.equals(p2) )
throw new RuntimeException("两次输入密码不一致");
dao.insert(registerFormBean);test.service.UserDaoImpl的insert方法:
getSqlMapClientTemplate().insert("user.insert", registerFormBean);Spring配置内容摘录:
<!-- ibatis相关 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@10.142.51.136:1521:orcl" />
<property name="username" value="ggpt" />
<property name="password" value="ylggpt3" />
<property name="minIdle" value="100" />
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlmap-config.xml" />
</bean> <!-- 事务管理相关 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager"/>
</bean> <!-- 其它 -->
<bean id="userDao" class="test.dao.UserDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<bean id="userServiceTarget" class="test.service.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="userService" parent="baseTransactionProxy">
<property name="target" ref="userServiceTarget" />
<property name="transactionAttributes">
<props>
<prop key="register">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver', cause: oracle.jdbc.driver.OracleDriverCaused by: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver', cause: oracle.jdbc.driver.OracleDriverCaused by: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver原来以为是oracle数据库的驱动没有安装正确,但是我已经反复确认,驱动应该没有问题。理由是下面几段代码都是可以正确运行的。(均在struts所需的execute方法中进行测试)
第一段:
Class.forName("oracle.jdbc.driver.OracleDriver");
运行后没有抛出ClassNotFoundException。
第二段:
oracle.jdbc.driver.OracleDriver driver = new oracle.jdbc.driver.OracleDriver();
单步运行发现可以正确的实例化oracle.jdbc.driver.OracleDriver对象。
第三段:
oracle.jdbc.driver.OracleDriver testDriver = (oracle.jdbc.driver.OracleDriver)SpringUtils.getBean("testDriver");
其中SpringUtils.getBean是从Spring框架取得bean对象。
对应的spring配置为:
<bean id="testDriver" class="oracle.jdbc.driver.OracleDriver" />
单步运行发现可以正确的得到testDriver对象。请各位大虾帮忙分析一下原因。
以下是帮助分析的一些附加信息。操作系统:Windows XP SP2
JDK版本:1.4.2
开发环境:MyEclipse 5.1 GA
所使用的jar包列表:
commons-beanutils.jar
commons-collections.jar
commons-digester.jar
commons-fileupload.jar
commons-lang.jar
commons-logging.jar
commons-validator.jar
jakarta-oro.jar
struts-legacy.jar
struts.jar
spring.jar
ibatis-common-2.jar
ibatis-sqlmap-2.jar
ibatis-sqlmap.jar
classes12.jar我编写的相关的类大致有:
test.bean.RegisterFormBean -- struts所需要的form bean,传递数据用
test.action.RegisterAction -- struts所需要的action类,提供execute方法
test.service.UserService -- 接口,处理“用户”业务逻辑
test.service.UserServiceImpl -- 实现test.service.UserService接口
test.dao.UserDao -- 接口,处理“用户”数据
test.dao.UserDaoImpl -- 实现test.dao.UserDao接口,使用ibatis来操作数据库主要代码摘录:
test.action.RegisterAction的execute方法
UserService userService =
(UserService)SpringUtils.getBean("userService");
userService.register(registerFormBean);
return mapping.findForward("success");test.service.UserServiceImpl的register方法:
String p1 = registerFormBean.getPassword1();
String p2 = registerFormBean.getPassword2();
if( !p1.equals(p2) )
throw new RuntimeException("两次输入密码不一致");
dao.insert(registerFormBean);test.service.UserDaoImpl的insert方法:
getSqlMapClientTemplate().insert("user.insert", registerFormBean);Spring配置内容摘录:
<!-- ibatis相关 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@10.142.51.136:1521:orcl" />
<property name="username" value="ggpt" />
<property name="password" value="ylggpt3" />
<property name="minIdle" value="100" />
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlmap-config.xml" />
</bean> <!-- 事务管理相关 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager" ref="transactionManager"/>
</bean> <!-- 其它 -->
<bean id="userDao" class="test.dao.UserDaoImpl">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
<bean id="userServiceTarget" class="test.service.UserServiceImpl">
<property name="userDao" ref="userDao" />
</bean>
<bean id="userService" parent="baseTransactionProxy">
<property name="target" ref="userServiceTarget" />
<property name="transactionAttributes">
<props>
<prop key="register">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
2 用这个程序,看一下你的当前类库到底有哪些!!http://www.java2000.net/viewthread.jsp?tid=98其中有一部分可以打印出当前可用的所有类库。