Я разрабатываю приложение в Enterprise JavaBeans 3.1 и получаю данные от Socket. Это приложение действует как слушатель, и после получения данных он обрабатывается. Это приложение было однопоточным и из-за его медленной обработки, приложение реализовано с помощью Threads, который теперь является многопоточным приложением. Таким образом, приложение теперь работает намного быстрее.Java Sockets Concurrency Threads To To Slow
Однако есть два потока, и оба потока обращаются к базе данных для вставки и обновления базы данных. Я сталкиваюсь с проблемой параллелизма, когда одна вставка потока и другие обновления вызывают проблемы. Чтобы справиться с параллелизмом, я добавил синхронизированный блок, чтобы заблокировать объект, убедившись, что выполняется полный блок. Выполнение этого приложения сейчас очень медленное, как это было с однопоточным приложением. Вставка и обновление выполняются через 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. Другой поток будет выполнен, и эта запись будет найдена и обновлена. Проблема в том, что после того, как начальная вставка и обработанная дата должны быть обновлены, а затем должен быть выполнен другой поток.
ПроцессMessage() передает данные через HTTPS асинхронно.
Одна из причин использования Threads заключалась в том, что на Java появилась только одна часть данных. Таким образом, вводя потоки, полный набор данных поступает на Java.
Таким образом, вашей проблемой параллелизма была база данных, а не потоковая передача. Я предлагаю вам опубликовать данные о таблице, вставке и запросе. – EJP
См. Изменение выше. – user3189663