繁体   English   中英

spring 如何管理与数据库的大量连接?

[英]spring how to manage lots connections to database?

我创建了连接到数据库并从数据创建 LineChart 的 javafx 应用程序,我工作正常,除了在循环中获取数据时连接到数据库并且在使用 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);
    }

我标记了我循环城市列表的代码的一部分,然后我建立了数据库连接以从该城镇获取供水公司,然后我将有关该城市水价的数据添加到图表中。

@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>

编辑:

我发现可以使用 spring 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=true 连接在数据源上调用close 时不会被关闭,所以当我们不再需要它时,我们需要手动关闭它。 我用下一种方式做到了:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM