spring 如何管理大量数据库连接?
spring how to manage lots connections to database?
我创建了连接到数据库并从数据创建折线图的 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 代码调用关闭数据源时连接不会关闭,所以我们需要在不再需要它时手动关闭它。
我用下一种方式做到了:
@Override
public void stop() {
SingleConnectionDataSource ds;
ds=((SingleConnectionDataSource)AppUtil.getContext().getBean("dataSource"));
ds.destroy();
AppUtil.closeContext();
}
我创建了连接到数据库并从数据创建折线图的 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 代码调用关闭数据源时连接不会关闭,所以我们需要在不再需要它时手动关闭它。 我用下一种方式做到了:
@Override
public void stop() {
SingleConnectionDataSource ds;
ds=((SingleConnectionDataSource)AppUtil.getContext().getBean("dataSource"));
ds.destroy();
AppUtil.closeContext();
}