我已经测试了一个套接字连接程序,其中套接字连接将是一个独立的线程,然后它将入队,而另一个用于dbprocessor的独立线程将从队列中选择并运行许多sql语句。所以我注意到这里是db处理的瓶颈。我想知道我正在做的是正确的架构,还是我应该改变或改进我的设计流程?
要求是通过套接字连接捕获数据并运行db进程,然后相应地存储它。
public class cServer
{
private LinkedBlockingQueue<String> databaseQueue = new LinkedBlockingQueue<String>();
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
try
{
final ServerSocket serverSocketConn = new ServerSocket(8000);
while (true){
try{
Socket socketConn1 = serverSocketConn.accept();
new Thread(new ConnectionHandler(socketConn1)).start();
}
catch(Exception e){
e.printStackTrace(System.out);
}
}
}
catch (Exception e){
e.printStackTrace(System.out);
}
}
}
答案 0 :(得分:1)
通常,您的架构听起来是正确的。在从队列读取/写入时,您需要确保正确同步两个线程。
我不确定你所说的“数据库处理的瓶颈”是什么意思?如果数据库处理花费很长时间并且你最终得到一个长队列,除了让多个线程执行数据库处理(假设处理可以并行处理,当然)或者在数据库中进行一些性能调整之外,你可以做的事情并不多。数据库线程。
如果您发布了一些您认为导致问题的特定代码,我们可以再看看。
答案 1 :(得分:1)
在没有要求的情况下判断架构很难(阅读&#39;不可能&#39;)。所以我会做一些:
最大吞吐量: 不要使用数据库,写入平面文件,可能存储在像固态光盘一样快的东西上。
保证持久性(如果用户得到的答案不包含错误,则必须安全地存储数据): 使整个事物单线程化,使用冗余光盘保存数据库中的所有内容。确保您拥有一位熟悉备份和恢复的DBA。定期测试。
完成用户请求的最短时间: 你的方法似乎合理。
完成用户请求的最短时间+最大化吞吐量+良好持久性(这意味着什么): 你的方法似乎很好。您可能计划处理数据库请求的多个线程。但是要测试你实际得到多少(更多)吞吐量以及瓶颈究竟在哪里(网络,数据库CPU,IO,锁争用......)。确保您不会通过使用并发方法来引入错误。
答案 2 :(得分:1)
这个简单的任务不需要两个线程。只需读取套接字并执行语句。