真心求高手帮忙编一个java编mod程序

posts - 32,&
comments - 140,&
trackbacks - 0
  近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机  应用程序已从传统的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期,主要使用的技术是﹑﹑等。之后,Sun公司推出了基于语言的Servlet+Jsp+JavaBean技术。相比传统的开发技术,它具有跨平台﹑﹑有效﹑可移植等特性,这使其更便于使用和开发。  Java应用程序访问的基本原理  在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁,  即Java语言通过JDBC技术访问数据库。JDBC是一种“开放”的方案,它为数据库应用开发人员﹑数据库前台工具开发人员提供了一种标准的应用程序接口,使开发人员可以用纯Java语言编写完整的数据库应用程序。JDBC提供两种API,分别是面向开发人员的API和面向底层的JDBC驱动程序API,底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实现与数据库的连接。  一般来说,Java应用程序访问数据库的过程(如图1所示)是:  ①装载数据库驱动程序;  ②通过JDBC建立数据库连接;  ③访问数据库,执行SQL语句;  ④断开数据库连接。图1 Java数据库访问机制  JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用  程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。   数据库连接池(connection pool)的工作原理  1、基本概念及原理由上面的分析可以看出,问题的根源就在于对连接资源的低效管理。我们知道,
  对于共享资源,有一个很著名的模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。连接池的基本工作原理见下图2。图2 连接池的基本工作原理  2、服务器自带的连接池  JDBC的API中没有提供连接池的方法。一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制,但是必须有其第三方的专用类方法支持连接池的用法。  连接池关键问题分析  1、并发问题  为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:public synchronized Connection getConnection()   2、多数据库服务器和多用户  对于大型的企业级应用,常常需要同时连接不同的数据库(如连接和)。如何连接不同的数据库呢?我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的url地址(&poolName.url&)﹑用户名(&poolName.user&)﹑密码(&poolName.password&)等信息。如tx.url=192.168.1.123:5000/tx_it,tx.user=cyl,tx.password=123456。根据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。  对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信息。  3、事务处理  我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。在语言中,Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit属性为false,然后显式的调用commit或rollback方法来实现。但要高效的进行Connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。
  4、连接池的分配与释放  连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。  对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。  5、连接池的配置与维护  连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minConn)和最大连接数(maxConn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。  如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。连接池的实现
  1、连接池模型  本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)和一个配置文件操作类(ParseDSConfig)。连接池类是对某一所有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后,把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占用的系统资源;④还能够处理无效连接(原来登记为可用的连接,由于某种原因不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。(5)当多数据库时,且数据库是动态增加的话,将会加到配置文件中。  连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息,创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于性问题,需要不同的用户使用不同的名称和密码。
2、连接池实现(经过本人改版,可以适用多数据库类型的应用以及一种数据库类型多个数据库且数据
库的数量可以动态增加的应用程序)
1),DBConnectionPool.java
数据库连接池类
2),DBConnectionManager .java
数据库管理类
3),DSConfigBean .java
单个数据库连接信息Bean
4),ParseDSConfig.java
操作多(这个'多'包括不同的数据库和同一种数据库有多个数据库)
数据 配置文件xml
5),ds.config.xml
数据库配置文件xml
原代码如下:
DBConnectionPool.java
----------------------------------------------------------
/** * 数据库连接池类 */import java.sql.Cimport java.sql.DriverMimport java.sql.SQLEimport java.util.ArrayLimport java.util.Iimport java.util.T/** * @author chenyanlin * */public class DBConnectionPool implements TimerListener { private Connection con= private int inUsed=0;
//使用的连接数 private ArrayList freeConnections = new ArrayList();//容器,空闲连接 private int minC
//最小连接数 private int maxC
//最大连接 private S
//连接池名字 private S //密码 private S
//数据库连接地址 private S
//驱动 private S
//用户名 public T
//定时 /**
*/ public DBConnectionPool() {
// TODO Auto-generated constructor stub } /**
* 创建连接池
* @param driver
* @param name
* @param URL
* @param user
* @param password
* @param maxConn
*/ public DBConnectionPool(String name, String driver,String URL, String user, String password, int maxConn) {
this.name=
this.driver=
this.url=URL;
this.user=
this.password=
this.maxConn=maxC } /**
* 用完,释放连接
* @param con
*/ public synchronized void freeConnection(Connection con)
this.freeConnections.add(con);//添加到空闲连接的末尾
this.inUsed--; } /**
根据timeout得到连接
* @param timeout
* @return
*/ public synchronized Connection getConnection(long timeout) {
Connection con=
if(this.freeConnections.size()&0)
con=(Connection)this.freeConnections.get(0);
if(con==null)con=getConnection(timeout); //继续获得连接
con=newConnection(); //新建连接
if(this.maxConn==0||this.maxConn&this.inUsed)
con=//达到最大连接数,暂时不能获得连接了。
if(con!=null)
this.inUsed++;
* 从连接池里得到连接
* @return
*/ public synchronized Connection getConnection() {
Connection con=
if(this.freeConnections.size()&0)
con=(Connection)this.freeConnections.get(0);
this.freeConnections.remove(0);//如果连接分配出去了,就从空闲连接里删除
if(con==null)con=getConnection(); //继续获得连接
con=newConnection(); //新建连接
if(this.maxConn==0||this.maxConn&this.inUsed)
con=//等待 超过最大连接时
if(con!=null)
this.inUsed++;
System.out.println("得到 "+this.name+" 的连接,现有"+inUsed+"个连接在使用!");
*释放全部连接
*/ public synchronized void release() {
Iterator allConns=this.freeConnections.iterator();
while(allConns.hasNext())
Connection con=(Connection)allConns.next();
con.close();
catch(SQLException e)
e.printStackTrace();
this.freeConnections.clear();
* 创建新连接
* @return
*/ private Connection newConnection() {
Class.forName(driver);
con=DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("sorry can't find db driver!");
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("sorry can't create Connection!");
* 定时处理函数
*/ public synchronized void TimerEvent()
//暂时还没有实现以后会加上的 } /**
* @param args
*/ public static void main(String[] args) {
// TODO Auto-generated method stub } /**
* @return the driver
*/ public String getDriver() { } /**
* @param driver the driver to set
*/ public void setDriver(String driver) {
this.driver = } /**
* @return the maxConn
*/ public int getMaxConn() {
return maxC } /**
* @param maxConn the maxConn to set
*/ public void setMaxConn(int maxConn) {
this.maxConn = maxC } /**
* @return the minConn
*/ public int getMinConn() {
return minC } /**
* @param minConn the minConn to set
*/ public void setMinConn(int minConn) {
this.minConn = minC } /**
* @return the name
*/ public String getName() { } /**
* @param name the name to set
*/ public void setName(String name) {
this.name = } /**
* @return the password
*/ public String getPassword() { } /**
* @param password the password to set
*/ public void setPassword(String password) {
this.password = } /**
* @return the url
*/ public String getUrl() { } /**
* @param url the url to set
*/ public void setUrl(String url) {
this.url = } /**
* @return the user
*/ public String getUser() { } /**
* @param user the user to set
*/ public void setUser(String user) {
this.user = }}------------------------------------------- DBConnectionManager .java------------------------------------------/** * 数据库连接池管理类 */import java.sql.Cimport java.util.ArrayLimport java.util.Eimport java.util.HashMimport java.util.Himport java.util.Iimport java.util.Pimport java.util.V/** * @author chenyanlin * */public class DBConnectionManager { static private DBConnectionM//唯一数据库连接池管理实例类 static
//客户连接数 private Vector drivers
= new Vector();//驱动信息 private Hashtable pools=new Hashtable();//连接池
* 实例化管理类
*/ public DBConnectionManager() {
// TODO Auto-generated constructor stub
this.init(); } /**
* 得到唯一实例管理类
* @return
*/ static synchronized public DBConnectionManager getInstance() {
if(instance==null)
instance=new DBConnectionManager();
* 释放连接
* @param name
* @param con
*/ public void freeConnection(String name, Connection con) {
DBConnectionPool pool=(DBConnectionPool)pools.get(name);//根据关键名字得到连接池
if(pool!=null)
pool.freeConnection(con);//释放连接
* 得到一个连接根据连接池的名字name
* @param name
* @return
*/ public Connection getConnection(String name) {
DBConnectionPool pool=
Connection con=
pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池
con=pool.getConnection();//从选定的连接池中获得连接
if(con!=null)
System.out.println("得到连接。。。"); } /**
* 得到一个连接,根据连接池的名字和等待时间
* @param name
* @param time
* @return
*/ public Connection getConnection(String name, long timeout) {
DBConnectionPool pool=
Connection con=
pool=(DBConnectionPool)pools.get(name);//从名字中获取连接池
con=pool.getConnection(timeout);//从选定的连接池中获得连接
System.out.println("得到连接。。。"); } /**
* 释放所有连接
*/ public synchronized void release() {
Enumeration allpools=pools.elements();
while(allpools.hasMoreElements())
DBConnectionPool pool=(DBConnectionPool)allpools.nextElement();
if(pool!=null)pool.release();
pools.clear(); } /**
* 创建连接池
* @param props
*/ private void createPools(DSConfigBean dsb) {
DBConnectionPool dbpool=new DBConnectionPool();
dbpool.setName(dsb.getName());
dbpool.setDriver(dsb.getDriver());
dbpool.setUrl(dsb.getUrl());
dbpool.setUser(dsb.getUsername());
dbpool.setPassword(dsb.getPassword());
dbpool.setMaxConn(dsb.getMaxconn());
System.out.println("ioio:"+dsb.getMaxconn());
pools.put(dsb.getName(), dbpool); } /**
* 初始化连接池的参数
*/ private void init() {
//加载驱动程序
this.loadDrivers();
//创建连接池
Iterator alldriver=drivers.iterator();
while(alldriver.hasNext())
this.createPools((DSConfigBean)alldriver.next());
System.out.println("创建连接池。。。");
System.out.println("创建连接池完毕。。。"); } /**
* 加载驱动程序
* @param props
*/ private void loadDrivers() {
ParseDSConfig pd=new ParseDSConfig(); //读取数据库配置文件
drivers=pd.readConfigInfo("ds.config.xml");
System.out.println("加载驱动程序。。。"); } /**
* @param args
*/ public static void main(String[] args) {
// TODO Auto-generated method stub }}----------------------------------------DSConfigBean.java----------------------------------------/** * 配置文件Bean类 *//** * @author chenyanlin * */public class DSConfigBean { private String type
=""; //数据库类型 private String name
=""; //连接池名字 private String driver
=""; //数据库驱动 private String url
=""; //数据库url private String username =""; //用户名 private String password =""; //密码 private int maxconn
=0; //最大连接数 /**
*/ public DSConfigBean() {
// TODO Auto-generated constructor stub } /**
* @param args
*/ public static void main(String[] args) {
// TODO Auto-generated method stub } /**
* @return the driver
*/ public String getDriver() { } /**
* @param driver the driver to set
*/ public void setDriver(String driver) {
this.driver = } /**
* @return the maxconn
*/ public int getMaxconn() { } /**
* @param maxconn the maxconn to set
*/ public void setMaxconn(int maxconn) {
this.maxconn = } /**
* @return the name
*/ public String getName() { } /**
* @param name the name to set
*/ public void setName(String name) {
this.name = } /**
* @return the password
*/ public String getPassword() { } /**
* @param password the password to set
*/ public void setPassword(String password) {
this.password = } /**
* @return the type
*/ public String getType() { } /**
* @param type the type to set
*/ public void setType(String type) {
this.type = } /**
* @return the url
*/ public String getUrl() { } /**
* @param url the url to set
*/ public void setUrl(String url) {
this.url = } /**
* @return the username
*/ public String getUsername() { } /**
* @param username the username to set
*/ public void setUsername(String username) {
this.username = }}-----------------------------------------------------ParseDSConfig.java-----------------------------------------------------/** * 操作配置文件类 读
写 修改 删除等操作
*/import java.io.FileInputSimport java.io.FileNotFoundEimport java.io.FileOutputSimport java.io.IOEimport java.io.InputSimport java.util.Limport java.util.Vimport java.util.Iimport org.jdom.Dimport org.jdom.Eimport org.jdom.JDOMEimport org.jdom.input.SAXBimport org.jdom.output.Fimport org.jdom.output.XMLO/** * @author chenyanlin * */public class ParseDSConfig { /**
* 构造函数
*/ public ParseDSConfig() {
// TODO Auto-generated constructor stub } /**
* 读取xml配置文件
* @param path
* @return
*/ public Vector readConfigInfo(String path) {
String rpath=this.getClass().getResource("").getPath().substring(1)+
Vector dsConfig=
FileInputStream fi =
fi=new FileInputStream(rpath);//读取路径文件
dsConfig=new Vector();
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(fi);
Element root=doc.getRootElement();
List pools=root.getChildren();
Element pool=
Iterator allPool=pools.iterator();
while(allPool.hasNext())
pool=(Element)allPool.next();
DSConfigBean dscBean=new DSConfigBean();
dscBean.setType(pool.getChild("type").getText());
dscBean.setName(pool.getChild("name").getText());
System.out.println(dscBean.getName());
dscBean.setDriver(pool.getChild("driver").getText());
dscBean.setUrl(pool.getChild("url").getText());
dscBean.setUsername(pool.getChild("username").getText());
dscBean.setPassword(pool.getChild("password").getText());
dscBean.setMaxconn(Integer.parseInt(pool.getChild("maxconn").getText()));
dsConfig.add(dscBean);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
fi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return dsC }/** *修改配置文件 没时间写 过段时间再贴上去 其实一样的
*/ public void modifyConfigInfo(String path,DSConfigBean dsb) throws Exception {
String rpath=this.getClass().getResource("").getPath().substring(1)+
FileInputStream fi= //读出
FileOutputStream fo= //写入
}/** *增加配置文件 * */ public void addConfigInfo(String path,DSConfigBean dsb)
String rpath=this.getClass().getResource("").getPath().substring(1)+
FileInputStream fi=
FileOutputStream fo=
fi=new FileInputStream(rpath);//读取xml流
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(fi); //得到xml
Element root=doc.getRootElement();
List pools=root.getChildren();//得到xml子树
Element newpool=new Element("pool"); //创建新连接池
Element pooltype=new Element("type"); //设置连接池类型
pooltype.setText(dsb.getType());
newpool.addContent(pooltype);
Element poolname=new Element("name");//设置连接池名字
poolname.setText(dsb.getName());
newpool.addContent(poolname);
Element pooldriver=new Element("driver"); //设置连接池驱动
pooldriver.addContent(dsb.getDriver());
newpool.addContent(pooldriver);
Element poolurl=new Element("url");//设置连接池url
poolurl.setText(dsb.getUrl());
newpool.addContent(poolurl);
Element poolusername=new Element("username");//设置连接池用户名
poolusername.setText(dsb.getUsername());
newpool.addContent(poolusername);
Element poolpassword=new Element("password");//设置连接池密码
poolpassword.setText(dsb.getPassword());
newpool.addContent(poolpassword);
Element poolmaxconn=new Element("maxconn");//设置连接池最大连接
poolmaxconn.setText(String.valueOf(dsb.getMaxconn()));
newpool.addContent(poolmaxconn);
pools.add(newpool);//将child添加到root
Format format = Format.getPrettyFormat();
format.setIndent("");
format.setEncoding("utf-8");
XMLOutputter outp = new XMLOutputter(format);
fo = new FileOutputStream(rpath);
outp.output(doc, fo);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
*删除配置文件
*/ public void delConfigInfo(String path,String name) {
String rpath=this.getClass().getResource("").getPath().substring(1)+
FileInputStream fi =
FileOutputStream fo=
fi=new FileInputStream(rpath);//读取路径文件
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(fi);
Element root=doc.getRootElement();
List pools=root.getChildren();
Element pool=
Iterator allPool=pools.iterator();
while(allPool.hasNext())
pool=(Element)allPool.next();
if(pool.getChild("name").getText().equals(name))
pools.remove(pool);
Format format = Format.getPrettyFormat();
format.setIndent("");
format.setEncoding("utf-8");
XMLOutputter outp = new XMLOutputter(format);
fo = new FileOutputStream(rpath);
outp.output(doc, fo);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
fi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
* @param args
* @throws Exception
*/ public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ParseDSConfig pd=new ParseDSConfig();
String path="ds.config.xml";
pd.readConfigInfo(path);
//pd.delConfigInfo(path, "tj012006");
DSConfigBean dsb=new DSConfigBean();
dsb.setType("oracle");
dsb.setName("yyy004");
dsb.setDriver("org.oracle.jdbc");
dsb.setUrl("jdbc:oracle://localhost");
dsb.setUsername("sa");
dsb.setPassword("");
dsb.setMaxconn(1000);
pd.addConfigInfo(path, dsb);
pd.delConfigInfo(path, "yyy001"); }}--------------------------------------ds.config.xml
配置文件--------------------------------------&ds-config&&pool&&type&mysql&/type&&name&user&/name&&driver&com.mysql.jdbc.driver&/driver&&url&jdbc:mysql://localhost:3306/user&/url&&username&sa&/username&&password&123456&/password&&maxconn&100&/maxconn&&/pool&&pool&&type&mysql&/type&&name&user2&/name&&driver&com.mysql.jdbc.driver&/driver&&url&jdbc:mysql://localhost:3306/user2&/url&&username&sa&/username&&password&1234&/password&&maxconn&10&/maxconn&&/pool&&pool&&type&sql2000&/type&&name&books&/name&&driver&com.microsoft.sqlserver.driver&/driver&&url&jdbc:sqlserver://localhost:1433/books:databasename=books&/url&&username&sa&/username&&password&&/password&&maxconn&100&/maxconn&&/pool&&/ds-config&3. 连接池的使用
1。Connection的获得和释放
DBConnectionManager
connectionMan=DBConnectionManager .getInstance();//得到唯一实例
//得到连接
String name="mysql";//从上下文得到你要访问的数据库的名字
Connection
con=connectionMan.getConnection(name);
。。。。。。。
// 使用完毕 connectionMan.freeConnection(name,con);//释放,但并未断开连接 2。数据库连接的动态增加和连接池的动态增加
1。调用xml操作增加类
2。重新实例华连接池管理池类
阅读(70383)
&re: Java jdbc数据库连接池总结!
没看出这个timeout有什么用处,没有实现超时机制。另外,DBConnectionPool.getConnection(long timeout)的实现中,明显需要先判断是否超过最大连接数,然后再new 新的connection,否则一旦超出,先前刚刚创建的新连接根本没有释放就返回null了。&&&&&&
&re: Java jdbc数据库连接池总结!
很不错,谢谢分享在“事务处理”那里的“ALL-ALL-NOTHING”原则 应为“ALL-OR_NOTHING”&&&&&&
&re: Java jdbc数据库连接池总结!
老大,TimerListener 类哪???&&&&&&
&re: Java jdbc数据库连接池总结!
大哥,能否给我一份,不胜感激,谢谢了
longen_516&#
QQ:8779870&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
兄弟,发我一份完整的吧,谢谢!!!
jingjiong&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
谢谢大大!好好学习!能否给我一份完整的!谢谢大大了!!
liuyingxiao&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
老大给我传份完整版的吧谢谢了!!!!
liuyingxiao&#
还有就是public class DBConnectionPool implements TimerListener
其中TimerListener要+什么包还是要实现这个方法&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
老大给我传份完整版的吧谢谢了!!!!
liuyingxiao&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
老大给我传份完整版的吧谢谢了!!!!
liuyingxiao&#&&&&&&
&re: Java jdbc数据库连接池总结!
麻烦把这个文档呵程序包发给我一份。小弟最近正在学做一个小网站,被数据库整得头都大了。幸好搜到了您的这篇文档。十分感激。
caigzh04&#&&&&&&
&re: Java jdbc数据库连接池总结!
你好~看了你的总结
有些地方不完整看不大明白~
我也希望能得到你完整的数据库连接池的Java代码~
小弟多谢了~
邮箱:yangkj2006&#&&&&&&
&re: Java jdbc数据库连接池总结!
谢谢,给份完整的代码!
zyw8136&#&&&&&&
&re: Java jdbc数据库连接池总结!
请也给我一份完整的代码,谢谢!
fenggui.gu&#&&&&&&
&re: Java jdbc数据库连接池总结!
不错兄弟,能发一份完成的代码吗?万分感谢!!
zhang_0308&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
兄弟,能给我发一份完整的代码吗?谢谢!!aimdlau&#&&&&&&
&re: Java jdbc数据库连接池总结!
谢谢chunkyo,只是有些地方看得不懂,比如说那个TimerListner接口是自己写的还是哪个第三方提供的类等,所以希望能得到完整的代码!hsbljyy&#.cn&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
测试了几次都没通过,能否发个完整版的给我?
beijihu3&#&&&&&&
&re: Java jdbc数据库连接池总结!
我也是调了好长时间也没调通,能否发个完整的给我
qsge2005&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
TimerListener没理解,能发给我个完整的么,谢谢!lidongge123&#QQ: 加qq时请注明理由,谢谢&&&&&&
&re: Java jdbc数据库连接池总结!
能不能给我一个完整版的阿,谢谢
maming134&#&&&&&&
&re: Java jdbc数据库连接池总结!
也发一份给我吧,先谢过了...
acon_cl&#&&&&&&
&re: Java jdbc数据库连接池总结!
liguiquan8&#.cn&&&&&&
&re: Java jdbc数据库连接池总结!
也给我一份学习了 谢谢 liguiquan8&#.cn&&&&&&
&re: Java jdbc数据库连接池总结!
谢谢楼上分享, 但调了很长时间没有调通,恳请搂主发一份完整代码,谢谢!
email:hxiaosu&#&&&&&&
&re: Java jdbc数据库连接池总结!
感觉不错,需要一份源码 谢谢
aty03&#&&&&&&
&re: Java jdbc数据库连接池总结!
能否发份源码给我。谢谢。&&&&&&
&re: Java jdbc数据库连接池总结!
能否发份源码给我。谢谢。
xa_yangfan&#.cn&&&&&&
&re: Java jdbc数据库连接池总结!
感觉不错,需要一份源码 谢谢
youranxj&#
&re: Java jdbc数据库连接池总结!
我正在学习连接池的东西,请问能也给我发一份完整代码吗
谢谢了! carlchou825&#.cn&&&&&&
&re: Java jdbc数据库连接池总结!
也给我发一份好么?谢谢~~~~~~~~~
xyzhang0010&#&&&&&&
&re: Java jdbc数据库连接池总结!
现在才看到,源码还有么!
发我一份
gaofeirong&#
非常感谢&&&&&&
&re: Java jdbc数据库连接池总结!
感觉很好,能否给一份完整的源码,非常感谢!!
&re: Java jdbc数据库连接池总结!
感觉很好,能否给一份完整的源码,非常感谢!! qianjiang520&#
&&&&&&
&re: Java jdbc数据库连接池总结!
写的太好了,正需要,麻烦给发一份完整的源码,多谢多谢!
邮箱:datang_flying&#&&&&&&
&re: Java jdbc数据库连接池总结!
兄台写得太棒了 !可否给小弟学习学习
zhangxinwe999&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
写的真好,受教了,不过确实不太完整,能否转送一份源码,小弟不胜感谢!james4837&#&&&&&&
&re: Java jdbc数据库连接池总结!
阿道夫&&&&&&
&re: Java jdbc数据库连接池总结!
看的不是很懂,希望大哥能给我一份完整版的,让我好好研究一下。
xue_qiwei&#.cn
非常崇拜!&&&&&&
&re: Java jdbc数据库连接池总结!
good~~~&&&&&&
&re: Java jdbc数据库连接池总结!
TimerListener没理解,能发给我个完整的么,谢谢!
luo_qing&#
QQ: 加qq时请注明理由,谢谢 &&&&&&
&re: Java jdbc数据库连接池总结!
TimerListener是不是第三方包,能否转送一份源码,不胜感谢!
janklan&#&&&&&&
&re: Java jdbc数据库连接池总结!
建议:楼猪的思路是面向过程的。建议去研究AOP,好好看一下JDK的java.lang.reflect.InvocationHandler和Proxy
良好的用户体验是这样的:
Connection conn = Pool.getConn();
// doSomething
conn.close();
// 不改变用户习惯,用户close也行放回空闲池
如何实现?很简单:
public Object invoke(...) {
if (!method.getName().equals(&close&)) return method.invoke(...);
// push back
强烈建议楼猪好好学习设计模式,否则会阻碍你发展的。&&&&&&
&re: Java jdbc数据库连接池总结!
能否也给我一份儿
mwgjkf&#
谢谢&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
能给我一份吗,
yachaofeng&#&&&&&&
&re: Java jdbc数据库连接池总结!
能否也给我一份儿
sxpujs&#&&&&&&
&re: Java jdbc数据库连接池总结!
谢谢您的分享,非常实用,也是我非常需要的现在,传给我一份吧。3Q!
zhangxiangyang.bupt&#&&&&&&
&re: Java jdbc数据库连接池总结!
第二次在笔试时碰到这问题。
给我也发一份我好好研究研究。
bing.huang8419&#&&&&&&
&re: Java jdbc数据库连接池总结!
写得很不错!!,可惜我调不出来,能发份完整的代码不?谢谢了
fly533&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
非常好,很实用,测试一下没有通过,能否传给我一份!
chinaxwn&#&&&&&&
&re: Java jdbc数据库连接池总结!
我自己写的那个没有分的这么细的,只是从dataSource中取得一个只读连接和写连接的。能否传我一份的!zhaoweiwei-2006&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
正在学习,希望传份详细的
谢谢了!
artwhy&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
我也刚开始学习连接池希望传我一份谢谢先!fl&#&&&&&&
&re: Java jdbc数据库连接池总结!
能否发我一份!
bluesky.mo&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
给一份完整的谢谢楼主
happy_javaboy&#&&&&&&
&re: Java jdbc数据库连接池总结!
能否发我一份! sjxlsn&# 谢谢了&&&&&&
&re: Java jdbc数据库连接池总结!
TimerListener
这是做什么用的,我看到很多人都在问。楼主你好, 我现在也在找连接池,麻烦你发一份给我,不胜感激。bisubisu&#&&&&&&
&re: Java jdbc数据库连接池总结!
能否传我一份啊,ddf168913&#,谢谢&&&&&&
&re: Java jdbc数据库连接池总结!
非常棒的资料,虽然内容不是很完全,不过完全实现了数据库连接池的核心,仔细理解以后,我抽取出了自己想要的代码,可以使用,十分感谢&&&&&&
&re: Java jdbc数据库连接池总结!
TimerListener 这是做什么用的,我看到很多人都在问。楼主你好, 我现在也在找连接池,麻烦你发一份给我,不胜感激。wanhition&#&&&&&&
&re: Java jdbc数据库连接池总结!
我想了解一下,可以用 WORD 文档 发一下这些代码给我吗?jiajia10161&#
唔该&&&&&&
&re: Java jdbc数据库连接池总结!
希望楼主也给我发一份完整的:包括源码和JAR包!谢谢
xu.yubao&#&&&&&&
&re: Java jdbc数据库连接池总结!
麻烦发一份到我邮箱
&# 最好带上测试代码&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
给我也发一份完整的吧 TimerListener不太明白是怎么回事
&#给我发一份完整的代码
谢谢&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
@Li
是啊,我也找不到这个接口&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
@油炸大龙虾
高手就是高手,向你学习&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
在程序中你后面留着的几个问题,有没有完整版本?有的话,麻烦给我一份。谢谢&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
谢谢你也给我一份完整的代码
急需!!&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
自己动手 成为 风衣祖师~!&&&&&&
&re: Java jdbc数据库连接池总结!
大哥,有没有完整的代码,给一份,谢谢,QQ:&&&&&&
&re: Java jdbc数据库连接池总结!
正在学习,能不能也发份完整代码给我,谢谢,dahuzij&# &&&&&&
&re: Java jdbc数据库连接池总结!
jdbc 连接池能给我份完整的源码吗,现在着急使用,谢谢,liuqinglong88&#&&&&&&
&re: Java jdbc数据库连接池总结!
jdbc 连接池能给我份完整的源码吗,现在着急使用,谢谢,servcelayer163&#&&&&&&
&re: Java jdbc数据库连接池总结!
你好!能不能麻烦发份完整版源码,急用下,谢谢 &#&&&&&&
&re: Java jdbc数据库连接池总结!
遇到第一个问题就是TimerListener,我本地建立的新类继承不了timerlistener,import java.util.T我也引入了&&&&&&
&re: Java jdbc数据库连接池总结!
我是发现了timer 是打酱油的啊???&&&&&&
&re: Java jdbc数据库连接池总结!
麻烦也给我一份吧,邮箱:&#,先感谢楼主!&&&&&&
&re: Java jdbc数据库连接池总结!
麻烦也给我一份吧,邮箱:&#,先感谢楼主!&&&&&&
&感谢楼主,鄙视要源码的
首先感谢楼主的精心整理,虽然是07年的,但对我帮助很大,同时也说一下要源码的,别人整理出来就不容易,如果几百个都去要人家还做事吗,自己多去调试整理&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
感谢楼主,虽然是07年的,不过正好新项目要用到连接池。不知能否发一份源码给我? 邮箱:&#
万分感谢&&&&&&
&re: Java jdbc数据库连接池总结!
求一份源码,谢谢、邮箱 &#&&&&&&
&re: Java jdbc数据库连接池总结!
感谢楼主分享,希望能给一份源码,邮箱&#&&&&&&
&re: Java jdbc数据库连接池总结!
看了你的博客,希望得到一份源码!谢谢了,邮箱&# &&&&&&
&re: Java jdbc数据库连接池总结!
看了你的博客,让我了解了更多,最近我正在学习连接池,能不能得到你的一份源代码呀……非常感谢……邮箱:ljj_0729&#&&&&&&
&re: Java jdbc数据库连接池总结!
那个所谓单列写的有问题。&&&&&&
&re: Java jdbc数据库连接池总结!
@静JING你要到源码了吗?给发一份呗!!!还有这个数据库连接池是在哪里实现创建多个连接的?&&&&&&
&re: Java jdbc数据库连接池总结!
@感谢楼主你好 我想要问一下这个数据库连接池是在哪里实现创建多个连接的?这个你知道是怎么实现的吗?&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
感觉楼主的单例模式 好像是错的&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
哪有这样实现单例类的?&&&&&&
&re: Java jdbc数据库连接池总结!
楼主,给我也发一份吧,正在学习中,突然发现自己的项目中急需数据库连接池,写的有点多,发一份完整的代码吧,不胜感激
邮箱:&#&&&&&&
&re: Java jdbc数据库连接池总结!
正在研究数据库连接池,楼主好人一生平安,只求一份源码,&#&&&&&&
&re: Java jdbc数据库连接池总结!
楼主能发份给我吗?谢谢&#&&&&&&
&re: Java jdbc数据库连接池总结!
测试成功&&&&&&
&re: Java jdbc数据库连接池总结!
信不信多线程并发情况下,会出现连接无法归还?取连接和还连接的同步不合理。&&&&&&
&re: Java jdbc数据库连接池总结!
楼主发份原码,谢谢
gtt509109&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
能不能发份完整的资料到我邮箱,感激不尽&#&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
能不能也发一份完整的代码给我,多谢楼主
&#&&&&&&
&re: Java jdbc数据库连接池总结!
能发我一份完整的代码给我啊,感谢楼主&&&&&&
&re: Java jdbc数据库连接池总结!
我按照你的方法进行配置,但是最后一打开数据连接就自动关闭,这是什么原因啊!&&&&&&
&re: Java jdbc数据库连接池总结!
真心不错,现在正在做服务器这块,数据库连接池 问题 ,无从下手,现在 了解很多,谢谢了。&&&&&&
&re: Java jdbc数据库连接池总结![未登录]
刚好需要封装一个数据库连接池,楼主大哥给我发一份完整的,多谢hhm.617&#&&&&&&
31123456789101114172022232425272829303112345678910
这个博客主要是关于java技术和开源技术,大家一起来进步了!
留言簿(10)
Java技术网站
http://www.liferay.net
/sysdesign/
Linux VS Unix
其他常去网站
中国最大最专业的水工行业电子商务平台,水工行业门户网站!
常光顾的BLOG
文学类网站
游戏类网站
积分与排名
阅读排行榜
评论排行榜}

我要回帖

更多关于 java编mod 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信