gpt4 book ai didi

java - ConnectionFactory 在 Tomcat 7 中使用 CDI 的奇怪行为

转载 作者:行者123 更新时间:2023-11-28 22:53:25 27 4
gpt4 key购买 nike

我有这个类(我的数据库连接工厂):

@ApplicationScoped
public class ConnectionFactory {

private ComboPooledDataSource datasource;

private Long open = 0l;
private Long close = 0l;

@PostConstruct
public void init() throws PropertyVetoException, SQLException {
datasource = new ComboPooledDataSource();
datasource.setDriverClass("org.postgresql.Driver");
datasource.setJdbcUrl("jdbc:postgresql:dbcampanha");
datasource.setUser("postgres");
datasource.setPassword("admin");

datasource.setMinPoolSize(1);
datasource.setMaxPoolSize(5);

datasource.setCheckoutTimeout(30000);
datasource.setUnreturnedConnectionTimeout(30);
datasource.setMaxIdleTime(30);

datasource.setDebugUnreturnedConnectionStackTraces(true);

datasource.setAcquireIncrement(1);
}

@Produces
@RequestScoped
public Connection getConnection() throws ClassNotFoundException {
open++;

try {
Connection connection = datasource.getConnection();
connection.setAutoCommit(false);

return connection;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public void close(@Disposes Connection connection) {
close++;

try {
connection.commit();
connection.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

public Long getOpenedConnectionCounter() {
return open;
}

public Long getClosedConnectionCounter(){
return close;
}

public ComboPooledDataSource getDatasource(){
return datasource;
}

}

我将此类与 JAX-RS 应用程序一起使用。对于使用这条路线的一些测试:

@RequestScoped
@Path("/test")
public class TesteService {

@Inject
private Connection connection;

@GET
@Produces(MyMediaType.JSON)
@Path("/yes")
public Response success() throws SQLException {
connection.getClientInfo("");

return Response.ok().build();
}

}

这门课是为我的客户准备的:

public class TesteMain {

private static final String prefix = "http://localhost:8080/schoolwork/service/test/";

public static void main(String[] args) throws InterruptedException {

for (int i = 0; i < 10000; i++) {
Request request = new Request(prefix + "yes");
request.start();

if(i % 10 == 0)
Thread.sleep(1000l);
}
}

public static class Request extends Thread {

private String rota;

public Request(String rota){
this.rota = rota;
}

@Override
public void run() {
try {
HttpURLConnection url = (HttpURLConnection) (new URL(rota).openConnection());
url.connect();

System.out.println(url.getResponseCode() == 200 ? "SUCCESS" : "ERROR");
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

}

}

我收到此信息:

{
"opened-connection": 789,
"closed-connection": 867,
}

是的,我关闭的数据库连接数大于打开的。如何?有什么想法吗?

我用

Tomcat 7 + Java 7

附言我很抱歉我的英语不好:/

已解决

我为 AtomicInteger 对象更改了我的计数器,并且工作得很好。

最佳答案

那么,两个简短的评论:

  1. 您的计数器由 1000 个并发线程(盒装)读取并随意更新。它们的值通常是不可预测和不确定的。他们当然不会准确地计算您希望他们计算的内容。考虑改用 AtomicLongs 上的原子操作。

  2. 您的commit()(或rollback())应该附加到您的数据库业务逻辑,您可以告诉工作单元的部分已经要么成功,要么失败。您不应在关闭时自动提交。

关于java - ConnectionFactory 在 Tomcat 7 中使用 CDI 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558568/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com