- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 DBCP 配置一直在创建新的连接,以至于我的 MySQL 服务器因为连接太多而阻塞了它:
public class SQL {
private final static String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private final static String USERNAME = "secret";
private final static String PASSWORD = "secret";
private final static String URL = "secret";
public static Connection getConnection() {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(DRIVER_CLASS_NAME);
basicDataSource.setUrl(URL);
basicDataSource.setUsername(USERNAME);
basicDataSource.setPassword(PASSWORD);
try {
return basicDataSource.getConnection();
} catch (SQLException ex) {
Logger.getLogger(SQL.class.getName()).log(Level.SEVERE, null, ex);
throw new IllegalStateException("bf4.sql.SQL.getConnection: No connection could be made: " + ex.getMessage());
}
}
}
我的 xxxManager.java:
public class PlayerkillManager extends Manager<PlayerkillBean, PlayerkillConstraint> {
public PlayerkillManager() {
super(SQL.getConnection());
}
@Override
protected PreparedStatement insertPS(final PlayerkillBean playerkill) throws SQLException {
PreparedStatement ps = connection.prepareStatement("INSERT INTO playerkills (`date`, `playerId`, `targetId`, `weaponId`, `headshot`) VALUES(?, ?, ?, ?, ?)", PreparedStatement.RETURN_GENERATED_KEYS);
ps.setObject(1, playerkill.getDate());
ps.setObject(2, playerkill.getPlayerId());
ps.setObject(3, playerkill.getTargetId());
ps.setObject(4, playerkill.getWeaponId());
ps.setObject(5, playerkill.getHeadshot());
return ps;
}
@Override
protected PreparedStatement updatePS(final PlayerkillBean playerkill) throws SQLException {
throw new UnsupportedOperationException("There are no non-key columns in this table.");
}
@Override
protected PreparedStatement deletePS(final PlayerkillBean playerkill) throws SQLException {
PreparedStatement ps = connection.prepareStatement("DELETE FROM playerkills WHERE `id` = ? AND `date` = ? AND `playerId` = ? AND `targetId` = ? AND `weaponId` = ? AND `headshot` = ?");
ps.setObject(1, playerkill.getId());
ps.setObject(2, playerkill.getDate());
ps.setObject(3, playerkill.getPlayerId());
ps.setObject(4, playerkill.getTargetId());
ps.setObject(5, playerkill.getWeaponId());
ps.setObject(6, playerkill.getHeadshot());
return ps;
}
@Override
protected String searchQuery() {
return "SELECT `playerkills`.`id`, `playerkills`.`date`, `playerkills`.`playerId`, `playerkills`.`targetId`, `playerkills`.`weaponId`, `playerkills`.`headshot` FROM playerkills";
}
@Override
protected String tableName() {
return "playerkills";
}
@Override
protected String[] columnNames() {
return new String[] {
"id",
"date",
"playerId",
"targetId",
"weaponId",
"headshot",
};
}
@Override
protected Map<TableField, List<List<TableField>>> getPaths() {
//Function not interesting and too much code
}
@Override
protected PlayerkillBean createBean(final ResultSet rs) throws SQLException {
return new PlayerkillBean(rs);
}
}
Manager.java类:
public abstract class Manager<B extends Bean, C extends AbstractConstraint> implements Closeable {
protected final Connection connection;
public Manager(final Connection con) {
this.connection = con;
}
public final int insert(final B b) throws InsertException {
try {
try (PreparedStatement ps = insertPS(b)) {
ps.executeUpdate();
try (ResultSet rs = ps.getGeneratedKeys()) {
rs.last();
if (rs.getRow() != 0) {
rs.beforeFirst();
rs.next();
return rs.getInt(1);
}
else {
return -1;
}
}
}
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new InsertException(ex);
}
}
public final boolean update(final B b) throws UpdateException {
try {
try (PreparedStatement ps = updatePS(b)) {
return ps.execute();
}
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new UpdateException(ex);
}
}
public final boolean delete(final B b) throws DeleteException {
try {
try (PreparedStatement ps = deletePS(b)) {
return ps.execute();
}
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new DeleteException(ex);
}
}
public final B get(final AbstractConstraint... c) throws SearchException {
List<B> beans = search(c);
if (beans.size() == 1) {
return beans.get(0);
}
throw new IllegalArgumentException("orm.Manager.get: beans.size() != 1: beans.size() = " + beans.size());
}
public final List<B> search(final AbstractConstraint... c) throws SearchException {
if (c.length == 0) {
throw new IllegalArgumentException("orm.Manager.search: c.length == 0");
}
try {
List<B> beans = new ArrayList<>();
for (AbstractConstraint constraint : c) {
try (PreparedStatement ps = new QueryBuilder(connection, tableName(), getPaths(), searchQuery()).add(constraint).build();
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
beans.add(createBean(rs));
}
}
}
if (c.length > 1) {
boolean sorting = true;
Field field = c[0].getField();
Order order = c[0].getOrder();
for (int i = 1; i < c.length; i++) {
Field currentField = c[i].getField();
Order currentOrder = c[i].getOrder();
if (!field.equals(currentField) || !order.equals(currentOrder)) {
sorting = false;
break;
}
}
if (sorting) {
//sort on field with comparator of supertype
}
}
return beans;
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new SearchException(ex);
}
}
public final List<B> getAll() throws SearchException {
return getAll(Order.NONE, null);
}
public final List<B> getAll(final Order order, final Field field) throws SearchException {
try {
List<B> beans = new ArrayList<>();
try (
PreparedStatement ps = connection.prepareStatement(searchQuery() + " " + orderQuery(order, field));
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
beans.add(createBean(rs));
}
}
return beans;
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
throw new SearchException(ex);
}
}
public final int getRowCount(final AbstractConstraint... c) throws SearchException {
return search(c).size();
}
@Override
public void close() {
//was uncommented?
try {
connection.close();
} catch (SQLException ex) {
Logger.getLogger(Manager.class.getName()).log(Level.SEVERE, null, ex);
}
}
private String orderQuery(final Order order, final Field field) {
if (order == Order.NONE) {
return "";
}
return "ORDER BY " + field.getFieldName() + " " + order.getOrdername();
}
abstract protected PreparedStatement insertPS(B b) throws SQLException;
abstract protected PreparedStatement updatePS(B b) throws SQLException;
abstract protected PreparedStatement deletePS(B b) throws SQLException;
abstract protected String searchQuery();
abstract protected String tableName();
abstract protected String[] columnNames();
abstract protected Map<TableField, List<List<TableField>>> getPaths();
abstract protected B createBean(ResultSet rs) throws SQLException;
}
我收集的一些统计数据:
总连接数:844
插入查询数:373
我原以为会使用 1 个连接,但出了什么问题?
编辑:为了澄清,我的代码调用 xxxManager 例如这样:playerkillManager.insert(new PlayerkillBean(...));
最佳答案
每次调用 SQL.getConnection()
时都会创建一个新的连接池,这不是连接池的使用方式。
您应该在您的应用程序周围共享一个 javax.sql.DataSource
( doc ),而不是单独的连接。
所以,也许您可以将代码更改为:
public class SQL {
private final static String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
private final static String USERNAME = "secret";
private final static String PASSWORD = "secret";
private final static String URL = "secret";
private final static DataSource dataSource;
static {
BasicDataSource basicDataSource = new BasicDataSource();
basicDataSource.setDriverClassName(DRIVER_CLASS_NAME);
basicDataSource.setUrl(URL);
basicDataSource.setUsername(USERNAME);
basicDataSource.setPassword(PASSWORD);
dataSource = basicDataSource;
}
public static DataSource getDataSource() {
return dataSource;
}
}
然后在其余的类(class)中,您可以使用该数据源。需要记住的重要事情是 DataSource.getConnection()
从池中借用一个连接,而 Connection.close()
实际上没有关闭连接;调用 close()
返回到池的连接。如果在借用的连接上调用 Connection.close()
失败,则连接泄漏。
您当前的代码需要编辑才能使用 try-with-resources借用连接时,例如
public void foo() {
try (Connection conn = datasource.getConnection()) {
//your code here
} catch (SQLException e) {
e.printStackTrace();
}
}
关于Java DBCP不断创建新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019816/
我正在使用 Apache Commons DBCP (commons-dbcp.jar) 连接池。 一旦我从池中获得连接,它就会被包装在类 org.apache.commons.dbcp.Poolin
Apache DBCP 的 maxIdle 属性描述为: “池中可以保持空闲的最大连接数,不会释放多余的连接,或者负数表示没有限制。” 有人可以解释一下“没有额外的被释放”是什么意思吗? 谢谢 最佳答
这两个连接池库之间似乎存在很多混淆。我想知道哪个更好(如果有的话)? 以下是我想提出的一些观点...有人可以验证一下吗? Tomcat DBCP:使用默认的 tomcat-dbcp.jar,它会出现在
我最近安装了较新版本的 Eclipse (Neon v1) 和 Tomcat 8.0,现在收到此错误: org.apache.tomcat.dbcp.dbcp cannot be resolved t
当我将数据从 arreylist 插入到一个 teble 中并且我正在使用 thred 时,我得到了这个异常。 谁能告诉我,因为我终于关闭了所有连接。 public class RunnableTh
我正在尝试使用以下代码连接到 MySQL 服务,但它无法初始化数据库类: import org.apache.tomcat.dbcp.dbcp.BasicDataSource; public clas
我正在 Eclipse Kepler 上做一个项目使用 JPA 2.1 , EclipseLink 2.5 , Struts 1.3并部署在 Tomcat 7.0 .我创建了一个名为 JPADataS
我试图在 Ubuntu 12.X 下的 Tomcat 7 中设置 JDBC 数据源,因此我将以下内容添加到 context.xml 文件中: 显然,使用正确且经过测试的数据库用户 ID 和密码。当我
geeting org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 无法通过使用 tomcat 服务器和
在我的应用程序中,我不断收到此异常。 org.springframework.dao.InvalidDataAccessApiUsageException: OracleLobCreator need
我有一个非常讨厌的问题,我似乎无法在任何地方找到答案。 我的应用程序在尝试保留 @Lob 时抛出此异常: java.lang.AbstractMethodError at org.apache.to
我的 Tomcat7@openshift 出现以下错误,我正在使用 jax-rs 和 spring4 以及 oracle 进行数据库连接(使用 JNDI 查找获取数据源)。目前,DataSource
这个问题在这里已经有了答案: ClassCastException when casting to the same class (11 个答案) 关闭 7 年前。 我在尝试检索在 Tomcat 全
我在从 oracle db web-app 上下文迁移到 postgresql db web-app 上下文时遇到问题。 我有一个简单的 java spring-mvc 网络应用程序,它带有 flyw
你好 当我尝试使用 JNDI 连接到数据源时,出现此错误: [org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDB
我正在使用 spring 、hybernate +jpa 开发一个基于 Web 的项目。我正在尝试使用 Atomkios 配置 JTA 事务 我的后端是mySql。我无法将应用程序设置为与 mySql
我最近决定将 spring-boot 添加到现有的 spring 项目中,该项目使用由 java 代码配置的 hibernate。我有这个 pom.xml 文件: 4.0.0 co
我正在运行 Tomcat 7.0.22,我编写了一个简单的 servlet,它连接到 SQL Anywhere 12.0 数据库。当我运行 servlet 时,我得到 java.lang.ClassC
我正在尝试使用池在 tomcat 中进行数据库连接,这就是我的上下文: 这就是我的 web.xml : MySQL JNDI Test DB Connection jdbc/s
我的 Tomcat 中的一个巨大的 web 应用程序有时会开始使用过多的 DBCP 连接,从而导致问题。 为了进行调查,我想在每个时间点准确地知道什么线程/方法持有池的连接。不需要是实时的,事后分析就
我是一名优秀的程序员,十分优秀!