Ibatis+JNDI连接数据库
2007-04-05 13:31
267 查看
做web应用的在客户现场经常碰到这样的拓扑结构:
这是一种典型的环境搭建模式.
这是我有一种需求,需要在客户端CLIENT1机器上做一个客户端小应用程序,这个程序需要访问数据库(DB SERVER),
这里我是用Ibatis实现的数据访问层,其访问数据库的方式有下面两种:
一.直连数据库(jdbc)
SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="SqlMapConfig.properties" />
<settings
cacheModelsEnabled="true"
enhancementEnabled="false"
lazyLoadingEnabled="true"
maxRequests="20"
maxSessions="10"
maxTransactions="15"
useStatementNamespaces="false" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<!--
==========================================================
All SQL Map XML files to be loaded by this SQL map.
Notice the paths are relative to the classpath.
==========================================================
-->
<sqlMap resource="sqlmap-oracle/test.xml" />
</sqlMapConfig>
SqlMapConfig.properties:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.0.197:1521:TEST
username=TEST
password=TestJNDI
通过这样连接没有问题,但是有一点,数据库的信息全部暴露在客户端了,无形之中增加了一定的安全隐患,客户一般也是不允许的.
如果CLIENT1客户端有专人管理,可能没问题,这里我主要介绍一下通过JNDI连接Web Server间接的访问数据库的方式.
二.通过JNDI连数据库
SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="false"
lazyLoadingEnabled="true"
maxRequests="20"
maxSessions="10"
maxTransactions="15"
useStatementNamespaces="false" />
<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://192.168.0.197:7001"/>
<property name="DataSource" value="jndi/ibatis/oraJNDI"/>
</dataSource>
</transactionManager>
<!--
==========================================================
All SQL Map XML files to be loaded by this SQL map.
Notice the paths are relative to the classpath.
==========================================================
-->
<sqlMap resource="sqlmap-oracle/test.xml" />
</sqlMapConfig>
具体配置如上所示,注意这两句:
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory"/>
<property name="context.java.naming.provider.url" value="t3://192.168.0.197:7001"/>
如果没这两句会找不到JNDI的,报错如下:
java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:84)
at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:62)
at com.nstc.greport.ibatis.TestSupport.setUp(TestSupport.java:29)
at junit.framework.TestCase.runBare(TestCase.java:125)
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:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:52)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:81)
... 12 more
Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:113)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:95)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:92)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:92)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:62)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:50)
... 13 more
Caused by: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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.datasource.JndiDataSourceFactory.initialize(JndiDataSourceFactory.java:60)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser$9.process(SqlMapConfigParser.java:318)
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:111)
... 18 more
Caused by: 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 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:280)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory.initialize(JndiDataSourceFactory.java:50)
... 20 more
我这里是用的weblogic提供的JNDI,在网上查了很多资料才找到这两个属性.
另外我们在做数据访问层时经常要用junit测试,这时在197机器上打开weblogic控制台,然后在开发机器上便可进行测试了.
需要在工程中加入weblogic.jar包,否则会报找不到weblogic类的错误.
这是一种典型的环境搭建模式.
这是我有一种需求,需要在客户端CLIENT1机器上做一个客户端小应用程序,这个程序需要访问数据库(DB SERVER),
这里我是用Ibatis实现的数据访问层,其访问数据库的方式有下面两种:
一.直连数据库(jdbc)
SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties resource="SqlMapConfig.properties" />
<settings
cacheModelsEnabled="true"
enhancementEnabled="false"
lazyLoadingEnabled="true"
maxRequests="20"
maxSessions="10"
maxTransactions="15"
useStatementNamespaces="false" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="${driver}" />
<property name="JDBC.ConnectionURL" value="${url}" />
<property name="JDBC.Username" value="${username}" />
<property name="JDBC.Password" value="${password}" />
</dataSource>
</transactionManager>
<!--
==========================================================
All SQL Map XML files to be loaded by this SQL map.
Notice the paths are relative to the classpath.
==========================================================
-->
<sqlMap resource="sqlmap-oracle/test.xml" />
</sqlMapConfig>
SqlMapConfig.properties:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.0.197:1521:TEST
username=TEST
password=TestJNDI
通过这样连接没有问题,但是有一点,数据库的信息全部暴露在客户端了,无形之中增加了一定的安全隐患,客户一般也是不允许的.
如果CLIENT1客户端有专人管理,可能没问题,这里我主要介绍一下通过JNDI连接Web Server间接的访问数据库的方式.
二.通过JNDI连数据库
SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<settings
cacheModelsEnabled="true"
enhancementEnabled="false"
lazyLoadingEnabled="true"
maxRequests="20"
maxSessions="10"
maxTransactions="15"
useStatementNamespaces="false" />
<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://192.168.0.197:7001"/>
<property name="DataSource" value="jndi/ibatis/oraJNDI"/>
</dataSource>
</transactionManager>
<!--
==========================================================
All SQL Map XML files to be loaded by this SQL map.
Notice the paths are relative to the classpath.
==========================================================
-->
<sqlMap resource="sqlmap-oracle/test.xml" />
</sqlMapConfig>
具体配置如上所示,注意这两句:
<property name="context.java.naming.factory.initial" value="weblogic.jndi.WLInitialContextFactory"/>
<property name="context.java.naming.provider.url" value="t3://192.168.0.197:7001"/>
如果没这两句会找不到JNDI的,报错如下:
java.lang.RuntimeException: Error occurred. Cause: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:84)
at com.ibatis.sqlmap.client.SqlMapClientBuilder.buildSqlMapClient(SqlMapClientBuilder.java:62)
at com.nstc.greport.ibatis.TestSupport.setUp(TestSupport.java:29)
at junit.framework.TestCase.runBare(TestCase.java:125)
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:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: com.ibatis.common.xml.NodeletException: Error parsing XML. Cause: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:52)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.parse(SqlMapConfigParser.java:81)
... 12 more
Caused by: java.lang.RuntimeException: Error parsing XPath '/sqlMapConfig/transactionManager/dataSource/end()'. Cause: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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:113)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:95)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:92)
at com.ibatis.common.xml.NodeletParser.process(NodeletParser.java:92)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:62)
at com.ibatis.common.xml.NodeletParser.parse(NodeletParser.java:50)
... 13 more
Caused by: com.ibatis.sqlmap.client.SqlMapException: There was an error configuring JndiDataSourceDaoTransactionPool. 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.datasource.JndiDataSourceFactory.initialize(JndiDataSourceFactory.java:60)
at com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser$9.process(SqlMapConfigParser.java:318)
at com.ibatis.common.xml.NodeletParser.processNodelet(NodeletParser.java:111)
... 18 more
Caused by: 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 javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:280)
at javax.naming.InitialContext.lookup(InitialContext.java:347)
at com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory.initialize(JndiDataSourceFactory.java:50)
... 20 more
我这里是用的weblogic提供的JNDI,在网上查了很多资料才找到这两个属性.
另外我们在做数据访问层时经常要用junit测试,这时在197机器上打开weblogic控制台,然后在开发机器上便可进行测试了.
需要在工程中加入weblogic.jar包,否则会报找不到weblogic类的错误.
相关文章推荐
- 重温SSH小项目实践(2)--Ibatis与Spring配置数据库连接
- JNDI连接数据库
- Jboss 服务器 JNDI 配置数据源连接数据库
- spring与ibatis的整合及多数据库连接的解决方案
- java使用JNDI 获取weblogic配置的数据源 连接数据库
- ibatis 数据库断开重连方法 jndi配置
- Spring配置下通过tomcat的jndi服务连接数据库
- JDBC和JNDI区别数据库连接区别
- jndi数据库连接方法
- JNDI连接数据库加密用户名密码
- 数据库连接学习(二)——Tomcat下使用C3P0配置JNDI数据源
- 用JNDI连接数据库
- 结合iBATIS在Spring中配置数据库连接,事务管理
- 重温SSH小项目实践(2)--Ibatis与Spring配置数据库连接
- 从jndi获取数据库连接
- kettle以JNDI的方式连接数据库 以及 乱码问题
- 为什么用JNDI连接数据库
- 使用jndi连接数据库
- 使用JNDI连接数据库
- jndi数据库连接方法