用到tomcat连oracle数据库配连接池了,搞了一天,终于搞好了,其中也遇到了几个很棘手的问题,现在贴出来,以备后人学习,少走些弯路;(手工配置连接池)
环境:tomcat5.5,oracle9i;(tomcat5.5和tomcat5.0的在server.xml中的写法有些区别)
首先,在tomcat的xml文件中创建数据源;
%tomcat_root%/conf/server.xml 中:
在<host>...</host>中添加一下代码:
<!--pool-->
<Context path="/solarcn " docBase="solarcn " debug="5" reloadable="true" crossContext="true">
<Resource name="solar_ds "
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@192.168.0.25:1521:ora "
username="solarcn "
password="solarcn "
maxActive="5"
maxIdle="10"
maxWait="5000"/>
</Context>
<!--//pool-->
--红色部分是需要你怎么更改的,现在挨个来解释下:
1.path="/solarcn" :这个是你的工程名的访问路径;
2.docBase="solarcn ":工程名;
3.Resource name="solar_ds " :数据源的名;
4.url="jdbc:oracle:thin:@192.168.0.25:1521:ora ":数据库连接路径;
下面的数据库用户名密码就不用说了....
其次,在%tomcat_root%/conf/web.xml中引用数据源;
在最后的</webapp>前加入以下代码:
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>solar_ds </res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
红色部分就是数据源的名称,和上面server.xml中的 Resource name="solar_ds " 相对应;
然后就是在程序中获得数据源了;
public static Connection getConn(){
Connection conn = null;
DataSource ds = null;
try {
Context ctx = new InitialContext();
Context envCtx = (Context) ctx.lookup("java:comp/env");
ds =(DataSource)envCtx.lookup("solar_ds "); //获得数据源,红色名字与上面server.xml中的数据源名字对应
conn = ds.getConnection();
} catch (NamingException e) {
e.printStackTrace();
}catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
这样就获得了Connection...
这里要注意一点,数据源的名字要统一了,我在server.xml、web.xml和程序中都是用的"solar_ds"作为我的数据源名称;
=================================================================================
下面说一下在配置过程中遇到的几个比较棘手的问题,这几个问题是在配置连接池时的主要拦路虎,我百度了大半天,终于一一搞定了```` ...
1. javax.naming.NameNotFoundException: Name java:comp is not bound in this Context
--这是在初始化context时(Context envCtx = (Context) ctx.lookup("java:comp/env");)抛出的异常;解决方法是把工程/WEB-INF/lib下面naming- common.jar,naming-factory.jar,naming-resources.jar三个jar包删除;
2。 org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create PoolableConnectionFactory (Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))))
--这是 在获得Connection的时候抛出的异常,前提是已经获得了数据源DataSource;出现这种情况是 无法创建连接池工厂对象,原因是连接被拒绝。
解决办法:检查建立数据源时(server.xml中) url 字符串,可能服务器地址、端口、数据库名或者数据库实例名等信息错误。修改。 尤其着重检查url中url="jdbc:oracle:thin:@192.168.0.25:1521:ora " 的ora,这个地方是数据库的实例名,而不是表空间的名字;
3。 Caused by: java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=150999297)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
--出现这种异常一般是和第2种关联一块出现的,按第2步的方法一般就能解决;
对了,还有别忘了把oracle数据库的驱动classes12.jar放到tomcat下去...
到此,应该就会成功的配置好连接池了,可以自己建个jsp测试一下拉...