在多线程服务器中处理数据库连接时出现问题 - Java

时间:2015-12-13 12:37:06

标签: java multithreading thread-safety spring-jdbc

我创建了一个基于Java的服务器,它将侦听来自客户端的数据。 当服务器接收数据时,它必须解析它和它。在数据库中更新它。 客户端非常频繁地发送数据说每2-3秒&客户数量可以从200-1000。 我所做的是Server正在持续监听来自客户端的数据。 当它接收数据时,它启动一个新线程(将是每个客户端的独立线程),它解析数据和数据。在数据库中更新它。 我只使用一个与数据库的连接来更新每个客户的信息 问题有时是先前的请求没有完成&客户端发送另一个请求,当我为所有客户端使用相同的数据库连接时,其他客户端也会增加。

我需要建议提高性能,我是否应该为每个客户创建单独的连接,否则我该怎么办?

编辑: - 任何人请帮助代码。 说如果我正在处理发送数据的600-700客户端&根据请求为每个客户创建单独的线程。然后打破它。那么我的数据库池大小应该是多少? 更多线程也在并行运行,这与数据库建立了连接。我是否需要等待如果正在处理客户端数据。但就我而言,我无法保存客户数据。我该如何处理? 请建议。

2 个答案:

答案 0 :(得分:1)

事先创建连接池。每当有新请求到来时,为该请求提供免费连接。这样,您就不会动态连接/断开连接,仍然可以获得连接可用性。

答案 1 :(得分:0)

你必须使用poolable连接数据库和线程池来使用它。

对于poolable连接,您可以使用Apache DBCP,查看configuration options
以下是示例用法

<table id="ticketTable">
  <tr><td>
          <select id="ticketSelect1">
             <option priceValue1="120" value="1" selected>Adult</option>
             <option priceValue1="110" value="2">Student</option>
          </select>
     </td>
     <td style="text-align:right"><span id="price1">120</span></td>
  </tr>
  <tr><th>Typ lístku</th><th style="text-align:right">Cena</th></tr>
        <tr><td><select id="ticketSelect2">
          <option priceValue2="120" value="1" selected>Adult</option>
          <option priceValue2="110" value="2">Student</option>
        </select></td><td style="text-align:right"><span id="price2">120</span></td></tr>
    </table>
<script type="text/javascript">
$(document).ready(function(){
  $("table tr td #ticketSelect1").change(function() {
        $('#price1').text($('option:selected').attr('priceValue1'));
    }).change();
  $("table tr td #ticketSelect2").change(function() {
        $('#price2').text($('option:selected').attr('priceValue2'));
    }).change();
});
</script>

对于线程池,您可以使用ExecutorService

它有以下方法

BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(JDBCDriver);
ds.setUrl(JDBCUrl);
ds.setUsername(JDBCUser);
ds.setPassword(JDBCPassword);
ds.setInitialSize(initSize);
ds.setMaxTotal(maxTotal);//negative for no limit
ds.setTestOnBorrow(false);
ds.setTestWhileIdle(true);

Connection con = ds.getConnection();

以下是样本用法

execute(Runnable)
submit(Runnable)
submit(Callable)
invokeAny(...)
invokeAll(...)

现在无论向ExecutorService提交多少个Runnable,它一次只能运行10个。