我正在开发Enterprise JavaBeans 3.1中的应用程序,并且我从Socket接收数据。此应用程序充当监听器,一旦收到数据就会被处理。此应用程序是单线程的,由于它处理速度很慢,因此应用程序使用现在是多线程应用程序的线程来实现。通过这样做,应用程序现在运行得更快。Java套接字并发线程太慢
但是,有两个线程,这两个线程访问数据库中插入和更新数据库。我面临一个线程插入和其他更新导致问题的并发问题。为了处理并发性,我添加了一个同步块来锁定一个对象,确保完整的块被执行。通过执行此应用程序现在非常缓慢,因为它与单线程应用程序一样。插入和更新通过JDBC完成。
还有什么可以做,所以它被处理,并且处理速度非常快,而不会减慢应用程序。下面是示例代码:
@Startup
@Singleton
public class Listener {
private ServerSocket serverSocket;
private Socket socket;
private Object object;
private InetAddress server;
@Resource
private ScheduledExecutorService executor;
@PostConstruct
public void init() {
object = new Object();
serverSocket = new ServerSocket("somePortNumber");
Runnable runnable = new Runnable() {
public void run() {
checkDatabase();
if(!isServerActive()) {
// send e-mail
listen();
}
else {
listen();
}
}
};
executor.scheduleAtFixedRate(runnable, 0, 0, TimeUnit.SECONDS);
}
public void listen() {
if(socket == null) {
socket = serverSocket.accept();
}
else if(socket.isClosed()) {
socket = serverSocket.accept();
}
startThread(socket);
}
public void startThread(Socket socket) {
Runnable runnable = new Runnable() {
public void run() {
processMessage(socket);
}
};
new Thread(runnable).start();
}
public void processMessage(Socket socket) {
synchronized(object) {
// build data from Socket
// insert into database message, sentDate
// do other things
// update processDate
}
}
public void checkDatabase() {
synchronized(object) {
// get data and further update
}
}
public boolean isServerActive() {
boolean isActive = true;
if(server == null) {
sever = InetAddress.getByName("serverName");
}
if(!server.isNotReachable(5000)) {
isActive = false;
if(socket != null) {
socket.close();
}
}
return isActive;
}
}
编辑:
Table name: Audit
Message: VARCHAR NOT NULL
SentDate: DATE NOT NULL
ProcessedDate: DATE
AnotherDate: DATE
Query: INSERT INTO AUDIT (message, sentDate, processedDate, receivedDate) VALUES (?, java.sql.Timestamp, null, null)
假设一个记录被插入而不同步块中插入消息和sentDate。另一个线程将执行,导致该记录被找到并进一步更新。问题是在初始insert和processedDate应该更新之后,应该执行另一个线程。
的而processMessage()通过HTTPS异步发送数据。
一个使用线程的一个原因是因为只有一个数据块来的Java。因此,通过引入线程,全套数据将传递给Java。即使是单线程
所以你的并发问题是数据库,而不是线程。我建议你发布表格,插入和查询的详细信息。 – EJP
请参阅上面的修改。 – user3189663