我正在使用Postgres 9.2-1002-jdbc4和Anorm 2.2.0 API运行Play 2.2.0应用程序.我经常遇到连接问题,如下所示:
2013-11-19 19:45:36,544 [ERROR][a.d.Dispatcher][play-akka.actor.default-dispatcher-17] This connection has been closed.org.postgresql.util.PSQLException: This connection has been closed.
at org.postgresql.jdbc2.AbstractJdbc2Connection.checkClosed(AbstractJdbc2Connection.java:822) ~[org.postgresql.postgresql-9.2-1002-jdbc4.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Connection.setAutoCommit(AbstractJdbc2Connection.java:769) ~[org.postgresql.postgresql-9.2-1002-jdbc4.jar:na]
at com.jolbox.bonecp.ConnectionHandle.setAutoCommit(ConnectionHandle.java:1247) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.<init>(ConnectionHandle.java:251) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.recreateConnectionHandle(ConnectionHandle.java:273) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at com.jolbox.bonecp.ConnectionHandle.close(ConnectionHandle.java:476) ~[com.jolbox.bonecp-0.8.0-rc1.jar:na]
at play.api.db.AutoCleanConnection.close(DB.scala:485) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DBApi$class.withConnection(DB.scala:84) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.BoneCPApi.withConnection(DB.scala:276) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DBApi$class.withTransaction(DB.scala:97) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.BoneCPApi.withTransaction(DB.scala:276) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DB$$anonfun$withTransaction$4.apply(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at play.api.db.DB$$anonfun$withTransaction$4.apply(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
at scala.Option.map(Option.scala:145) ~[org.scala-lang.scala-library-2.10.2.jar:na]
at play.api.db.DB$.withTransaction(DB.scala:185) ~[com.typesafe.play.play-jdbc_2.10-2.2.0.jar:2.2.0]
Run Code Online (Sandbox Code Playgroud)
我知道没有数据库连接问题; 数据库运行在同一个盒子上.这些连接问题每天间歇性地发生2-3次,并且可以自行恢复.
我尝试了这些荒谬的低连接测试设置:
db.default.idleConnectionTestPeriod=10 seconds
db.default.idleMaxAge=30 seconds
db.default.maxConnectionAge=60 seconds
Run Code Online (Sandbox Code Playgroud)
这些连接设置似乎可以减少它,虽然我想知道是否有更基本的事情发生.postgres日志中没有任何内容.
有什么方法可以从 Java 应用程序更改 postgreSQL 当前数据库?或者有什么等价物\connect report吗?我知道我可以通过更改 JDBC 连接字符串来做到这一点,但有没有更好的选择?
我在我的webapp中使用postgres db.
我添加了以下依赖项pom.xml:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
在IntelliJ Idea控制台日志中,我看到以下文本(深色,这意味着它是stdout-ed):
Nov 17, 2013 12:32:40 PM org.apache.naming.NamingContext lookup
WARNING: Unexpected exception resolving reference
org.postgresql.util.PSQLException: ???????????????: ???????????????????????????????????? "traffic" ?????? ?????????????????? ???????????????????????? ????????????????????????????????? (?????? ??????????????????)
at org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:291)
at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:108)
at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66)
at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:125)
at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30)
at org.postgresql.jdbc3g.AbstractJdbc3gConnection.<init>(AbstractJdbc3gConnection.java:22)
at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:30)
at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24)
at org.postgresql.Driver.makeConnection(Driver.java:393)
at org.postgresql.Driver.connect(Driver.java:267)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:267)
[...skipped...]
javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1420)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:848)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at …Run Code Online (Sandbox Code Playgroud) public class HelloPostgreSQLActivity extends Activity {
TextView resultArea;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
resultArea = new TextView(this);
resultArea.setText("Please wait.");
setContentView(resultArea);
new FetchSQL().execute();
}
private class FetchSQL extends AsyncTask <Void,Void,String> {
@Override
protected String doInBackground(Void... params) {
//TextView tv=(TextView)findViewById(R.id.text);
String retval = "";
// String msg="connected";
try {
Class.forName("org.postgresql.Driver");
// tv.setText(msg);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
retval = e.toString();
}
String url = "jdbc:postgresql://192.168.1.92/postgres? user = postgres & password = admin";
Connection conn;
try {
DriverManager.setLoginTimeout(25);
conn = …Run Code Online (Sandbox Code Playgroud) 有时,Hibernate 在持久操作期间似乎随机执行这样的查询:
select currval('MY_TABLE_NAME_id_seq');
Run Code Online (Sandbox Code Playgroud)
实体:
@Entity
@Table(name = "MY_TABLE_NAME")
public class MyEntity {
@Id
@Column(name = "ID", unique = true, nullable = false)
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
}
Run Code Online (Sandbox Code Playgroud)
代码:
@Transactional
public void persistMyEntity(String name) {
MyEntity entity= new MyEntity (name);
sessionFactory.getCurrentSession().persist(entity);
}
Run Code Online (Sandbox Code Playgroud)
生成的sql:
insert into MY_TABLE_NAME(name) values ('xyz');
select currval('MY_TABLE_NAME_id_seq');
Run Code Online (Sandbox Code Playgroud)
但通常select currval不会被执行。对此有什么解释吗?
顺便说一句,我的问题与此非常相似,但问题中的解决方案对我不起作用。
笔记:
My_TABLE_NAME ddl sql:
CREATE TABLE my_table_name (
id bigserial NOT NULL,
name character varying(256) NOT NULL,
CONSTRAINT my_table_name_id PRIMARY KEY (id)
);
Run Code Online (Sandbox Code Playgroud)
休眠特性: …
我有一个表(10k 行),在text列中存储大值。当前最大的未压缩大小为 417 MB(烘烤后为 85 MB)。此设计中的缺陷是无法传输这些值(例如通过 JDBC) - 使用此列的任何内容都必须将整个内容读入内存。
是否有任何工具或快捷方式可用于将此列迁移到大型对象?最大限度地减少所需的工作磁盘和内存。
lo_compat_privileges如果这有什么区别的话我会使用。