您的位置:首页 > 数据库

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类的错误.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: