2015-08-31 55 views
-1

我创建了javafx apllication,它连接到数据库并从数据创建LineChart,并且我工作得很好,除了在循环中获取数据时连接到数据库并使应用程序在使用h2嵌入式数据库时变慢时。我正在使用spring jdbcDaoSupport进行查询。春天如何管理与数据库的大量连接?

在循环中进行连接是不好的设计,但我不知道我会如何使它工作不同。我应该如何管理这样的连接?

我试过寻找答案,但我没有发现任何与我的问题有关的东西。

下面是相关的代码部分:

public void cijenaVodePoGradovimaGraf(){ 
     ObservableList<Grad> gradList; 
     ObservableList<String> gradNaziv; 
     gradNaziv=FXCollections.observableArrayList(); 
     gradList=databaseService.getVodoopskrbaGradList(); 

     for (Grad grad : gradList) { 
      gradNaziv.add(grad.getNaziv()); 
     } 

     CategoryAxis xOs=new CategoryAxis(gradNaziv); 
     xOs.setTickLabelRotation(270); 
     xOs.setTickLabelFont(Font.font(14)); 

     NumberAxis yOs=new NumberAxis(); 
     yOs.setLabel("Cijena [kn/kubik]"); 
     yOs.setTickLabelFont(Font.font(14)); 

     XYChart.Series<String, Number> series=new XYChart.Series<>(); 
     series.setName("Varijabilni dio"); 
     XYChart.Series<String, Number> series2=new XYChart.Series<>(); 
     series2.setName("Fiksni dio"); 

     //this is where problem is 
     for(int i=0;i<gradNaziv.size();i++){ 
      ObservableList<Vodoopskrba> v=databaseService.getVodoopskrbaList(gradNaziv.get(i)); 
      series.getData().add(new XYChart.Data<>(gradNaziv.get(i),v.get(0).getVodoOdvVar())); 
      series2.getData().add(new XYChart.Data<>(gradNaziv.get(i),v.get(0).getVodoOdvFix())); 
     } 
     ObservableList<XYChart.Series<String, Number>> data=FXCollections.observableArrayList(); 
     data.add(series); 
     data.add(series2); 

     lcGraf=new LineChart<>(xOs,yOs,data); 
     lcGraf.setTitle("Cijena vode"); 

     for(XYChart.Series<String, Number> s : lcGraf.getData()) { 
      for (XYChart.Data<String, Number> d : s.getData()) { 
       Tooltip tt=new Tooltip(d.getYValue().toString()); 
       Tooltip.install(d.getNode(), tt); 
       d.getNode().setOnMouseEntered((event)->{ 
        d.getNode().getStyleClass().add("onHover"); 
       }); 
       d.getNode().setOnMouseExited((event)->{ 
        d.getNode().getStyleClass().remove("onHover"); 
       }); 
      } 
     } 

     AnchorPane root=((AnchorPane)this.getStage().getScene().getRoot()); 
     ((GridPane)root.getChildren().get(0)).add(lcGraf, 0, 1, 2, 1); 
    } 

标志着我的代码部分我在哪里循环流经城市的列表,然后我想提出的数据库连接,从那个小镇获得供水公司,然后我添加有关该城市水价的数据图表。

+2

如果您一直在创建新的连接,您将需要使用连接池。 – Kayaman

+0

@Kayaman我是新来的春天可以提供示例如何在春天使用h2数据库设置连接池 – redMist

+0

好吧,连接池可能有点矫枉过正,尤其是对于H2,但创建数据库连接是昂贵的,因此尝试重用他们。不要在循环中打开一个新循环,而要在循环外部打开一个新循环。 – Kayaman

回答

0

@Kayaman建议我应该使用连接池,并在互联网上的一些研究后,我发现如何设置它,它解决了速度问题,现在阶段加载立即。我在这里发布解决方案,以便其他人也遇到这个问题。

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="${jdbc.driver}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="username" value="${jdbc.user}" /> 
     <property name="password" value="${jdbc.pass}" /> 
     <property name="initialSize" value="5" /> 
     <property name="maxActive" value="10" /> 
     <property name="maxIdle" value="5" /> 
     <property name="minIdle" value="2" /> 
</bean> 

它唯一需要改变的事情。

<!-- tomcat jdbc dependency --> 
<dependency> 
    <groupId>org.apache.tomcat</groupId> 
    <artifactId>tomcat-jdbc</artifactId> 
    <version>7.0.35</version> 
</dependency> 

编辑:

我发现,它可以采用弹簧SingleConnectionDataSource使JdbcDaoSupport重用相同的连接和多数民众赞成正是我需要的。

这里是代码:

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.SingleConnectionDataSource"> 
     <property name="driverClassName" value="${jdbc.driver}" /> 
     <property name="username" value="${jdbc.user}" /> 
     <property name="password" value="${jdbc.pass}" /> 
     <property name="url" value="${jdbc.url}" /> 
     <property name="suppressClose" value="true" /> 
    </bean> 

因为当代码调用收盘数据源,所以我们需要手动关闭它,当我们不需要它了suppressClose =真正的连接不会被关闭。 我是这么做的:

@Override 
    public void stop() { 
     SingleConnectionDataSource ds; 
     ds=((SingleConnectionDataSource)AppUtil.getContext().getBean("dataSource")); 
     ds.destroy(); 
     AppUtil.closeContext(); 
    }