日期:2014-05-17  浏览次数:21067 次

eclipse+tomcat6.0+oracle 10g配置数据库连接池的错误
tomcat下context.xml中的配置如下:
<Resource name="jdbc/oraldb" auth="Container" type="javax.sql.DataSource"
 axActive="100" maxIdle="30" maxWait="10000" username="scott" password="tiger"
riverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"/>

web.xml中配置如下:

<resource-ref>   
    <res-ref-name>jdbc/oraldb</res-ref-name>   
    <res-type>javax.sql.DataSource</res-type>   
    <res-auth>Container</res-auth>   
</resource-ref>

获得数据库连接的代码如下:
public Connection getConnection(){
    try{
        Context cxt=new InitialContext();
DataSource ds=(DataSource)cxt.lookup("java:comp/env/jdbc/oraldb");
conn=ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
return conn;
}

测试代码如下:
Connection conn=DBHelper.getInstance().getConnection();
System.out.println(conn);

错误信息: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;
问题不用细说了吧,求助!
------最佳解决方案--------------------
没有初始化上下文错误:需要指明ClassName
不知道是不是你少打了一个字母 dirverClassName少了一个d
------其他解决方案--------------------
这种方式必须要tomcat启动的情况下才能得到Connection,
另外它有三个缺点:
1,不能直接在main方法中运行,也就不能测试,很不方便!
2,不能正常读写Oracle的clob字段,会导致很多功能做不了!
3,效率不及dbcp或c3p0,其实后两者也都实现了javax.sql.DataSource接口,可以算是它的扩展版,可以在本工程中配置,可以在main方法中运行
------其他解决方案--------------------
引用:
没有初始化上下文错误:需要指明ClassName
不知道是不是你少打了一个字母 dirverClassName少了一个d

这是我发帖的时候少打了,程序里没有少,所以不是这的错误,该注意的地方都检查了,就是不知道哪儿出了问题
发出来看看,希望大家指出什么地反容易出错,我好再查,谢谢!
------其他解决方案--------------------
java类中测试报错,jsp页面中用<%javacode%>测试可以通过,看了论坛里很久以前的帖子说是jsp是容器内,是有jndi.properties文件的默认配置的,java是在容器外部,自行进行jndi.properties文件配置。网上提了一些在ejb和spring下修改配置的方法。我现在还没有接触那些,连接池在没用任何框架的时候是ok的,现在用在struts2中就不行了,希望有明白原理的大侠给个解决方案。
------其他解决方案--------------------
哎,纠结了半天原来这个问题没什么意义。
配置好数据库连接池之后想要进行测试,所以想单独运行java文件(也就是不运行jsp),选择的是run as java application,这个时候tomcat容器没有运行,所以会报题中的错误。
这只是为了调试数据库连接池才会单独运行这个java类的。
实际上,正式使用的时候连接池是在整个项目中作为工具类被调用的,也就是正式运行的时候采用的是run as run on server 方式,这个时候不会有异常发生。我已经自己测试过了。
为这个问题忙了大半夜,虽然原理上还是不懂,但是总算是把问题解决了。或多或少有点收获,留帖为证吧,也希望后来有遇到同样问题的人看了有所收获。
睡了!