回 帖 发 新 帖 刷新版面

主题:数据连接池连接数据出错

在tomcat的server.xml中插入如下内容:
<Context path="/ch07" docBase="ch07" debug="0" reloadable="true" crossContext="true">
       <Resource name="jdbc/cn" auth="Container" type="javax.sql.DataSource"/>
    <ResourceParams name="jdbc/cn">
    <parameter>
       <name>factory</name>
        <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    
    <parameter>
            <name>driverClassName</name>
       <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>
     </parameter>
    <parameter>
       <name>url</name>
           <value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=student</value>
    </parameter>
        <parameter>
          <name>username</name>
          <value>sa</value>
    </parameter>
     <parameter>
          <name>password</name>
        <value> </value>
     </parameter>
        <parameter>
      <name>maxActive</name>
      <value>20</value>
      </parameter>
    <parameter>
       <name>maxIdle</name>
       <value>10</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>-1</value>
    </parameter>
       </ResourceParams>
    </Context>
用于获得连接的类:
package bole;
import java.sql.*;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DatabaseConn
{
    public static  Connection getConnection() throws Exception
    {
        try
        {
            Context initCtx = new javax.naming.InitialContext();
            Context envCtx=(Context)initCtx.lookup("java:comp/env");
            DataSource ds = (DataSource)envCtx.lookup("jdbc/bn");
            return ds.getConnection();
        }
        finally
        {
        }
    }
}
使用数据源的servlet:
package bole;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import java.io.*;
public class DataSourceTestServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet 
{
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        // TODO Auto-generated method stub
        response.setContentType("text/html;charset=gb2312");
        PrintWriter out = response.getWriter();
        try
        {
            Connection con=DatabaseConn.getConnection();
            Statement stmt = con.createStatement();
            //stmt.execute("select * from course");
            ResultSet rst = stmt.executeQuery("select * from course");
            while(rst.next())
            {
                out.println(rst.getString("id"));
                out.println(rst.getString("name"));
            }
            stmt.close();
            con.close();
        }
    }                       
}
可是运行时出现错误,东西比较多,麻烦各位了

回复列表 (共8个回复)

沙发

<Context path="/JSPBook" docBase="JSPBook" debug="0" crosscontext="true" reloadable="true">
  <Resource name="jdbc/sample_db" auth="Container"
            type="javax.sql.DataSource"/>
  <ResourceParams name="jdbc/sample_db">
    <parameter>
      <name>factory</name>
      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
    </parameter>
    <parameter>
      <name>username</name>
      <value>root</value>
    </parameter>
    <parameter>
      <name>password</name>
      <value>browser</value>
    </parameter>
    <parameter>
      <name>driverClassName</name>
      <value>com.mysql.jdbc.Driver</value>
    </parameter>
    <parameter>
      <name>url</name>
      <value>jdbc:mysql://localhost:3306/sample_db?useUnicode=true&amp;characterEncoding=UTF-8</value>
    </parameter>
    <parameter>
      <name>maxActive</name>
      <value>20</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>5</value>
    </parameter>
    <parameter>
      <name>maxWait</name>
      <value>10000</value>
    </parameter>
  </ResourceParams>
</Context>


import java.sql.Connection; //第一行
import java.sql.DriverManager; 
import java.sql.SQLException; 
public class MySQLConnection{
    
    static{
        try{
            Class.forName("com.mysql.jdbc.Driver").newInstance();    
            System.out.println("Success loading Mysql Driver!");//第10行
        }catch(Exception e){
            System.out.println("Error loading Mysql Driver!");
            e.printStackTrace();
}
    }
public static void main(String[] args){

    try{
        Connection con1= 
            DriverManager.getConnection("jdbc:mysql://localhost:3306/sample_db?user=root&password=****&useUnicode=true&characterEncoding=GB2312");    
        System.out.println("Success esabling the connecton..........");
    
        con1.close();
    }
    catch(SQLException e)
    {e.printStackTrace();
    }


}
}          

用一个简单点测试行不行?
MySQLConnection.java 测试用的,你可以参考一下我的server.xml配置

板凳

楼上的,你的代码我看着有点不明白,你这样写有调用过server.xml里的配置吗,我感觉你这样写没用过里面的数据源配置啊

3 楼

我今天又写了一个测试的页面:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="javax.naming.*"%>
<%@ page import="javax.sql.*"%>
<%@ page import="java.sql.*"%>
<html>
<head>
</head>
<body>
<%
Context ctx=null;
Connection cnn=null;
Statement stmt=null;
ResultSet rs = null;
try
{
    ctx = new InitialContext();
    if(ctx==null)
        out.println("没有匹配的环境");
    out.println("找到环境"+"<br>");
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/bn");
    if(ds == null)
        out.println("没有匹配的数据库");
    else
    {
        out.println("找到数据库");
        out.println(ds.toString()+"<br>");
    }
    try
    {
        cnn = ds.getConnection();
    }
    catch(Exception e)
    {
        out.println(e.toString()+"<br>");
    }
    try
    {
        stmt = cnn.createStatement();
    }
    catch(Exception e)
    {
        out.println(e.toString()+"<br>");
    }
    try
    {
        rs = stmt.executeQuery("select * from course");
    }
    catch(Exception e)
    {
        out.println(e.toString()+"<br>");
    }
}
finally
{
    if(rs!=null)
        rs.close();
    if(stmt!=null)
        stmt.close();
    if(cnn!=null)
        stmt.close();
    if(ctx!=null)
        ctx.close();
}
%>
</body>
</html>
出现的结果是:
找到环境
找到数据库 org.apache.tomcat.dbcp.dbcp.BasicDataSource@14d1d41
org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null'
java.lang.NullPointerException
java.lang.NullPointerException

4 楼

<ResourceParams name="jdbc/sample_db">
这个不是数据源码?

5 楼

那个是数据源,可是感觉你没用jndi去找到数据源,而是直接就在用了啊

6 楼

把程序里的jdbc/bn改成jdbc/cn就可以了

7 楼

楼上的真细心,不过我已经改过来了还是出错,错误见三楼

8 楼

哪位能给讲讲连接池中:
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/bn");
括号内的java:comp/env/jdbc/bn是什么意思么? 谢谢了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册