我有套接字连接,它会通过databaseQueue.add(message);
将数据发送到队列中。接下来是DatabaseProcessor
类,它在启动期间作为线程启动,将建立单个数据库连接。连接将继续通过databaseQueue.take();
和处理消息。关于这一部分的好处是,只需要建立一个数据库连接。当突然出现数据激增时就会出现问题。所以另一种方法是,对于收到的每个数据,我将打开和关闭方法。那么根据您的重负荷经验,这是最好的方式吗?
我的代码的一些片段。
class ConnectionHandler implements Runnable {
ConnectionHandler(Socket receivedSocketConn1) {
this.receivedSocketConn1=receivedSocketConn1;
}
// gets data from an inbound connection and queues it for databse update
public void run() {
databaseQueue.add(message); // put to db queue
}
}
class DatabaseProcessor implements Runnable {
public void run()
{
// open database connection
createConnection();
while (true)
{
message = databaseQueue.take(); // keep taking message from the queue add by connectionhandler and here I will have a number of queries to run in terms of select,insert and updates.
}
}
void createConnection()
{
System.out.println("Crerate Connection");
connCreated = new Date();
try
{
dbconn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?"+"user=user1&password=*******");
dbconn.setAutoCommit(false);
}
catch(Throwable ex)
{
ex.printStackTrace(System.out);
}
}
}
public void main()
{
new Thread(new DatabaseProcessor()).start(); //calls the DatabaseProcessor
//initiate the socket
}
答案 0 :(得分:0)
据我所知,您正在管理客户端 - 服务器Socket连接,您可以通过队列发送和接收消息。如果我也做对了,你就是为队列中的每条新消息创建一个线程。
考虑到会发送和读取大量消息,我建议您在线程Synchronized中声明方法,这样每次数据都不需要打开和关闭流式传输。收到(请参阅此处的第二种方法)。同步方法通常是处理可由线程同时修改的公共数据激增的最佳方法。
答案 1 :(得分:0)
您可以使用连接池来充分利用这两个方面:您不仅限于单个线程,而且您也不需要为每个请求打开连接。看看Apache DBCP。
答案 2 :(得分:0)
这种方法很好。除非您可以使用c3pO创建数据库池。还可以使用threadPool执行程序来模拟线程池。