我写了一个JAVA连接池的类,经理说有严得的错误,大家帮我看一下 1、没有同步原语,多线程并发时会有问题。2、conn是成员,每调用一次getconnection就被覆盖一次,而且如果数据库失败,会莫名其妙的获得上一次的连接。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就是synchronizedpublic static synchronized ServiceLocator getInstance() if(conn == null){ Context ctx = new InitialContext(); DataSource ds=(DataSource)ctx.lookup( "java:comp/env/jdbc/tongxuelu "); conn = ds.getConnection(); } package com.serviceLocator;import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import javax.naming.Context;import javax.naming.InitialContext;import javax.naming.NamingException;public class ServiceLocator { public static Connection getConnection()throws NamingException, SQLException { Context ctx = new InitialContext(); DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/tongxuelu"); Connection conn = ds.getConnection(); return conn; }}我把它改成这样,还有什么错吗? getConnection()方法不要写成静态的 这样行不??//p157package system.module.db;import java.sql.*;public class DBconn{ String DBDriver="sun.jdbc.odbc.JdbcOdbcDriver"; //设置数据库连接字符? String ConnStr=""java:comp/env/jdbc/tongxuelu"; Connection conn=null; ResultSet rs=null; public DBconn(){ try{ Class.forName(DBDriver); //加载驱动 }catch(java.lang.ClassNotFoundException e){ System.err.println("DBconn():"+e.getMessage()); } } public ResultSet executeQuery(String sql){ rs=null; try{ //连接数据库 conn=DriverManager.getConnection(ConnStr); //创建SQL语句对象 Statement stmt=conn.createStatement(); rs=stmt.executeQuery(sql); }catch(SQLException ex){ System.err.println("aq.executeQuery:"+ex.getMessage()); } return rs; } public int executeUpdate(String sql){//数据库的更新操作 int result=0; try{ conn=DriverManager.getConnection(ConnStr); Statement stmt=conn.createStatement(); result=stmt.executeUpdate(sql); }catch(SQLException ex){ System.err.println(ex.getMessage()); } return result; } public void close(){ try{ if(conn!=null) conn.close(); }catch(Exception e){ System.out.print(e); }try{ if(rs!=null) rs.close(); }catch(Exception e){ System.out.println(e); } } } 球不是这么踢地,连接池不是这么写地http://www.10zhizui.cn 要是连接池这么 好写的话 就用不着那些第三方jar包 了可以看看 PROXCOOL 很有用的数据库连接池 架包 tomcat服务启动报如下错误 求助 正则表达式匹配 正数 <c:out>标签输出值时 能设置输出字体的颜色吗 使用birt做报表必须要安装eclipse吗 关于https的问题!!!!!!!!! 如何解决1000万人访问的jave服务器数据库瓶颈? jms通信安全的问题! TOMCAT5.0.27如何建立多个虚拟目录 急!!!电子政务软件上线前的准备工作主要是哪几方面呀。 Struts1.1例子,启动服务不成功!大虾帮忙! 請教 什么是log4j.properties 怎么配置
Context ctx = new InitialContext();
DataSource ds=(DataSource)ctx.lookup( "java:comp/env/jdbc/tongxuelu ");
conn = ds.getConnection();
}
import java.sql.SQLException;import javax.sql.DataSource;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class ServiceLocator
{
public static Connection getConnection()throws NamingException, SQLException
{
Context ctx = new InitialContext();
DataSource ds=(DataSource)ctx.lookup("java:comp/env/jdbc/tongxuelu");
Connection conn = ds.getConnection();
return conn;
}
}
我把它改成这样,还有什么错吗?
//p157
package system.module.db;
import java.sql.*;
public class DBconn{
String DBDriver="sun.jdbc.odbc.JdbcOdbcDriver";
//设置数据库连接字符?
String ConnStr=""java:comp/env/jdbc/tongxuelu";
Connection conn=null;
ResultSet rs=null;
public DBconn(){
try{
Class.forName(DBDriver);
//加载驱动
}catch(java.lang.ClassNotFoundException e){
System.err.println("DBconn():"+e.getMessage());
}
}
public ResultSet executeQuery(String sql){
rs=null;
try{
//连接数据库
conn=DriverManager.getConnection(ConnStr);
//创建SQL语句对象
Statement stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
}catch(SQLException ex){
System.err.println("aq.executeQuery:"+ex.getMessage());
}
return rs;
}
public int executeUpdate(String sql){//数据库的更新操作
int result=0;
try{
conn=DriverManager.getConnection(ConnStr);
Statement stmt=conn.createStatement();
result=stmt.executeUpdate(sql);
}catch(SQLException ex){
System.err.println(ex.getMessage());
}
return result;
}
public void close(){
try{
if(conn!=null)
conn.close();
}catch(Exception e){
System.out.print(e);
}try{
if(rs!=null)
rs.close();
}catch(Exception e){
System.out.println(e);
}
}
}
http://www.10zhizui.cn