我使用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>