如何保护数据库免受Web应用程序中写入它的两个客户端

时间:2015-09-22 22:27:41

标签: java multithreading web-applications

您好我对网络应用中的多线程有疑问。在我的应用程序中,我有一个Controller,它将参数传递给Business Logic类,它与数据库进行通信,基本上它将数据加载到db,然后进行一些查询并接收答案。所以,我想让这些方法同步,以便只有一个客户端可以将数据加载到数据库,但现在我真的很困惑,因为通常每个请求都会触发新线程(我想从我读过的内容),我担心这样做,例如。假设我有两个客户端,client1使用线程1,他访问使用同步方法运行Runnable Interface创建的新线程,客户端2使用线程2我担心他也可以访问同步方法,因为他有得到了他自己的线程。这与thread1无关。是否有可能2个客户端能够访问自己的同步方法?或者我应该销毁我正在创建的新线程并使所有类同步。所以我很困惑如何从两个写入它的客户端保护数据库?提前谢谢。

2 个答案:

答案 0 :(得分:0)

Apache ActiveMQ可以解决您的问题。

您将要做的是在您的网络服务器上配置/安装Apache ActiveMQ。 在那里你可以创建一个队列(比如DBrequests),它将负责将你的查询保存到数据库中。

将有消费者和生产者。在您的情况下,client1和client2是生产者(即它产生要发布到数据库的请求)。您的线程会将请求放入队列。

现在您的消费者将会生效。如果有任何消息,消费者线程将始终监听队列。消息可用后,您可以使用该消息触发数据库查询。

这里有一个hello world示例:http://activemq.apache.org/hello-world.html

你可以这样做。使用来自控制器的参数在HelloWorldProducer中构建查询并在HelloWorldConsumer中触发该查询。你的问题应该解决了。

答案 1 :(得分:0)

大多数数据库同步请求,因此只要将数据库语句放在同一事务中,如果需要处理自我一致的数据库视图,并且只要适当地设置数据库隔离级别,就不要需要担心线程同步。例外情况是你使用SQLite,它并不真正支持多线程。