请教:多线程连接数据库,如何传递connection问题(200分)

  • 主题发起人 主题发起人 liuchy
  • 开始时间 开始时间
L

liuchy

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在做多线程访问数据库碰到一个问题,非常着急,请大虾指教。
在系统中我采用每个线程类分配一个数据库连接connection,通过某个类
(假设类名为A)实现对数据库操作,需要做的是将connection赋予类A的成员变量。
但问题在于线程类可能不直接调用类A,而是通过类B,C,D,最后访问类A,这样
需要将connection层层传递,而其它类并不需要connection 。
请问大虾有什么更好的解决办法。非常感谢。

 
那当然你的BCD仍然需要接收connection
既然BCD调用了A,那么BCD也是做数据库操作的,带connection是必然的
 
去antic_ant.delphibbs.com上看看,我写了一个放到上面了,不过不时太好
 

请问antic_ant , antic_ant.delphibbs.com网我为什么无法登录,你能将它贴到这里吗,
在此不甚感谢。
 

to 曹晓钢:我开始也这么想,总觉得传递的层数好象太多,以至类之间耦合性太强;
不知曹兄意下如何。
我想过用一个静态连接池,与线程无关,每次数据操作时获取空闲的连接,
但这样可能会出现几个相关联的数据操作在不同context中完成。
希望哪位大虾教我。
 
我觉得你的逻辑是不是有问题呀
为什么不要用的会要继承呢
不能把A分为A1 和 A2吗
A1中包含connection A2中则包含其它不就可以了
 
应该定义一个 Connection Pool 类,每个需要Connection类 getInstance 就好了,这是
PoolMan (SourceForge)的实现模型
 
连接池和搂主的问题是两回事。
getInstance之后,还需要保持transaction. 某一步出错之后,所有的操作都必须回滚。
这时候必须有一个唯一的connection 在各个object之间传递。
我把我自己的这个类放出来吧:
代码:
package com.beaconsystem.relation;
import java.sql.*;
/**
 * Insert the type's description here.
 * Creation date: (7/19/2001 6:24:43 PM)
 * @author: Xiaogang cao
 */
public abstract class AbstractShareConnectionObject {
	protected boolean isNewConnection = false;
	protected java.sql.Connection innerCon = null;
/**
 * ShareConnetionObject constructor comment.
 */
public AbstractShareConnectionObject() {
	super();
}
/**
 * ShareConnetionObject constructor comment.
 */
public AbstractShareConnectionObject(Connection con) 
{
	super();
	this.setCon(con);
}
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:04 PM)
 * @return com.beaconsystem.util.db.BeaconConnection
 */
protected void closeCon()
throws SQLException
{
	if (innerCon!=null &&
isNewConnection() == true)
	{
		innerCon.close();
		innerCon = null;
	}
}
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:04 PM)
 * @return com.beaconsystem.util.db.BeaconConnection
 */
protected void commit()
throws SQLException
{
	if (innerCon!=null &&
isNewConnection() == true)
	{
		innerCon.commit();
	}
}
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:04 PM)
 * @return com.beaconsystem.util.db.BeaconConnection
 */
protected abstract Connection getCon() throws SQLException ;
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:22 PM)
 * @return boolean
 */
protected boolean isInTransaction()
throws SQLException
{
	return !this.getCon().getAutoCommit();
}
/**
 * Insert the method's description here.
 * Creation date: (7/13/2001 1:57:21 PM)
 * @return boolean
 */
public boolean isNewConnection() {
	return isNewConnection;
}
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:04 PM)
 * @return com.beaconsystem.util.db.BeaconConnection
 */
protected void rollback()
throws SQLException
{
	if (innerCon!=null &&
isNewConnection() == true)
	{
		innerCon.rollback();
	}
}
/**
 * Insert the method's description here.
 * Creation date: (7/6/2001 6:44:04 PM)
 * @param newCon com.beaconsystem.util.db.BeaconConnection
 */
protected void setCon(Connection newCon) 
{
	if (innerCon!=null)
	{
		try
		{
			closeCon();
		}
		catch (Exception e)
		{}
	}
	
	innerCon = newCon;
	setIsNewConnection(false);
	
}
/**
 * Insert the method's description here.
 * Creation date: (7/13/2001 1:57:21 PM)
 * @param newIsNewConnection boolean
 */
public void setIsNewConnection(boolean newIsNewConnection) {
	isNewConnection = newIsNewConnection;
}
}
这个类是所有数据库操作类的基础抽象类。你的可持续化类都必须继承自这个基础类。
在你的类内部做任何数据库操作,都是这样的:
代码:
	java.sql.Connection con = null;
	java.sql.PreparedStatement pstmt = null;
	String SQL = null;
	
	SQL="UPDATE xxxTable set xxx=?";
	try {
		con = getCon();
		int id=1;
		pstmt = con.prepareStatement(SQL);
		pstmt.setString(id++, yyy);
		pstmt.executeUpdate();
		commit();
		//todo
	}
	catch (SQLException sqle) {
		//todo
		rollback();
		System.err.println("Error : " + sqle);
		sqle.printStackTrace();
		throw sqle;
	}
	finally {
		try {pstmt.close();} catch (Exception e) {}
		try {closeCon();
}	catch (Exception e) {}
	}
基础类会管理connection.
connection 只应该在jsp中生成和释放,至于这个connection是否由poolman得来,这个我不关心。
java可持续化类只需要getCon()和closeCon()。
 
这个connection必须在各个可持续化类中传递。
他继承自这个基础类,就已经有一个传递一个connection的构造方法。如果你需要带有其他参数
得构造方法,你应该加上connection 参数,以便传递connection.
你的调用代码应该是这个样子:
//within a classAdo
some database action;
AnotherClass classB = new AnotherClass(this.getCon());
classB.doSomething();
try ( this.closeCon();) catch (Exception e) {}
 
我也来理解一下上面的思路:
connection 不应是,由线程类获得后而传给类A,
而应该由类A获得,线程类不应该关心connection.
 
改用数据库连接池类。
jakarta的开源project,
commons-dbcp
commons-pool-1.0.1.zip
 
后退
顶部