Posted on 2009-04-08 09:10
landor 閱讀(2123)
評論(0) 編輯 收藏 所屬分類:
ibatis
用
JDBC方式基本配置都很簡單,weblogic的數據源JNDI名字是:TestDatasource
那么ibatis的SqlMapConfig.xml的配置如下
<transactionManager type="JDBC" >
<dataSource type="JNDI">
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory" />
<property name="context.java.naming.provider.url" value="t3://localhost:7001" />
<property name="DataSource" value="TestDatasource" />
</dataSource>
</transactionManager>
此時啟動weblogic服務器,進行正常junit測試即可(這里需要把weblogic.jar加到classpath中)
然而如果用如下的配置方式
<transactionManager type="JTA" >
<property name="UserTransaction" value="javax.transaction.UserTransaction"/>
<dataSource type="JNDI">
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory" />
<property name="context.java.naming.provider.url" value="t3://localhost:7001" />
<property name="DataSource" value="TestDatasource" />
</dataSource>
</transactionManager>
也就是用JTA來做事務,那么會出現錯誤
java.lang.ExceptionInInitializerError
at gmt.boss.obs.account.recurringcharge.IbatisTest.setUp(IbatisTest.java:12)
at junit.framework.TestCase.runBare(TestCase.java:128)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: Error initializing JtaTransactionConfig while looking up UserTransaction (javax.transaction.UserTransaction). Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:89)
at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:63)
at testIbatis.IbatisInstance.<clinit>(IbatisInstance.java:27)
12 more
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: Error initializing JtaTransactionConfig while looking up UserTransaction (javax.transaction.UserTransaction). Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:53)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:86)
14 more
Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: Error initializing JtaTransactionConfig while looking up UserTransaction (javax.transaction.UserTransaction). Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:123)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:105)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:102)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:72)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:51)
15 more
Caused by: com.ibatis.sqlmap.client.SqlMapException: Error initializing JtaTransactionConfig while looking up UserTransaction (javax.transaction.UserTransaction). Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at com.ibatis.sqlmap.engine.transaction.jta.JtaTransactionConfig.initialize(JtaTransactionConfig.java:50)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser$6.process(SqlMapConfigParser.java:306)
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:121)
19 more
我已經在配置文件里配置了context.java.naming.factory.initial,而在這里還提示這個錯誤
關鍵看這里
Error initializing JtaTransactionConfig while looking up UserTransaction (javax.transaction.UserTransaction). Cause: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
在jvm里加上一個參數,測試一下
-Djava.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
運行通過
這個參數在:右鍵項目--Run as --Open Run Dialog--Arguments的VM arguments中添加即可
引入ibatis幫助的一段話,如下:
警告!雖然這些看起來很簡單,但記住不要濫用全局(分布式)事務,這點很重要。
這樣做既有性能方面的考慮,同時也是因為全局事務會讓應用服務器和數據庫驅動程序的設置變得更復雜。
雖然看起來簡單,您可能還是會遇到一些困難。記住,EJB擁有更多廠商和工具支持。
對于需要分布式事務的應用,最好還是使用Session EJB