ps.setString(1,username)
ps.setString(2,password)
你的 sql改变后,ps要重新prepare,上面的代码改成
String sql="insert into message(username,password) values(?,?)"
ps=conn.prepareStatement(sql)
ps.setString(1,username)
ps.setString(2,password)
就可以了
最后记得拉完屎后要擦屁股。
rs, ps, con都要顺次关闭,不然会引起内存泄漏,数据库宕机
你指的是JDBC连接池连接超时失效问题的问题吧?
这是因为mysql默认保持连接的时间是8小时,如果这个连接在8小时内无人访问的话,就会关闭这个连接。但是连接池设计的时候没有考虑到这个问题,还把失效的连接拿出去就会导致出现异常。
解决方法:
1、创建一个线程每隔一段时间就测试一下连接,保持连接时最新的,永远达不到8小时无人访问。
2、连接池取连接的时候判定是否这个连接有效。
[java] view plain copy
if (conn.isValid(1000)){
return conn
}
else{
return this.CreateConnection()
}
3、不使用连接池,直接拿了就用,用了就还。
连接池的概念:
用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。
JDBC数据库连接池接口(DataSource):
Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!
Java用JDBC实现对Oracle数据库 *** 作import java.sql.Connection
import java.sql.DriverManager
public class UtilDbForOracle {
public static Connection getConnection(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance()
String url = "jdbc:oracle:thin:@192.168.0.10:1521:ora920"
String username = "shihuan"
String password = "zznode"
Connection conn = DriverManager.getConnection(url, username, password)
// System.out.println(conn + "------return conn")
return conn
}
catch (Exception e){
System.out.println(e.getMessage())
return null
}
}
}
----------------------------------------------------------------------
import java.sql.Connection
import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import org.apache.commons.logging.Log
import org.apache.commons.logging.LogFactory
public class DBOperaRule {
private Connection conn = null
// private Statement stmt = null
private PreparedStatement pstmt = null
private ResultSet rs = null
private boolean hadErrors = false
//创建数据库连接
public void createConnection(){
conn = UtilDbForOracle.getConnection()
}
//发起事务
public void beginTransaction(){
try {
conn.setAutoCommit(false)
} catch (SQLException e) {
e.printStackTrace()
}
}
//执行事务
public void commitTransaction() throws SQLException{
if(!hadErrors){
conn.commit()
}else{
conn.rollback()
hadErrors = false
}
hadErrors = false
conn.setAutoCommit(true)
}
//标记出错
public void errorOccur(){
hadErrors = true
}
//执行插入、删除和更新 *** 作
synchronized public void execute(String sql) throws SQLException {
this.pstmt = conn.prepareStatement(sql)
if(pstmt != null){
pstmt.executeUpdate(sql)
}else{
Log log = LogFactory.getLog("mylog")
log.error("数据库插入数据出错")
}
}
//执行查询 *** 作
synchronized public ResultSet read(String sql) throws SQLException {
this.pstmt = conn.prepareStatement(sql)
// Statement stmt = conn.createStatement()
if(pstmt != null){
// if(stmt != null){
ResultSet tmp = null
tmp = pstmt.executeQuery(sql)
// tmp = stmt.executeQuery(sql)
//下面为打印数据表中的字段名称
// ResultSetMetaData md = tmp.getMetaData()
// for(int i=1i<=md.getColumnCount()i++){
//System.out.println(md.getColumnName(i))
//}
//循环打印数据库中的值
// while(tmp.next()){
// System.out.println("tmp是否在最后一行:" + tmp.isLast())
// System.out.println("row: " + tmp.getRow())
// System.out.println(tmp.getString(1) + " -->" + tmp.getString(2))
// }
return tmp
}else{
return null
}
}
//执行查询个数 *** 作
synchronized public int readCount(String sql) throws SQLException {
this.pstmt = conn.prepareStatement(sql)
int nCount = 0
try{
if(pstmt != null){
ResultSet tmp = null
tmp = pstmt.executeQuery(sql)
if(tmp != null &&tmp.next()){
nCount = tmp.getInt(1)
}else{
nCount = 0
}
}
}catch(SQLException e){
nCount = 0
}
return nCount
}
//创建数据库连接
/*
public boolean createConnection(){
try{
conn = UtilDbForOracle.getConnection()
conn.setAutoCommit(false)
}catch(SQLException e){
System.out.println("createConnectionError!")
System.out.println(e.getMessage())
return false
}
return true
}
*/
//进行数据库增,删除,更新 *** 作
/*
public boolean executeUpdate(String sql){
if(conn == null){
createConnection()
}
try{
stmt = con.createStatement()
int iCount = stmt.executeUpdate(sql)
System.out.println(" *** 作成功, *** 作影响的记录数:" + String.valueOf(iCount))
}catch(SQLException e){
System.out.println("executeUpdateError!")
System.out.println(e.getMessage())
return false
}
return true
}
*/
/*
public boolean executeUpdateBatch(List list){
if(conn == null) createConnection()
try{
stmt = conn.createStatement()
for(int i = 0i <list.size()++i)
stmt.addBatch((String) list.get(i))
int i[] = stmt.executeBatch()
System.out.println(" *** 作成功, *** 作影响的记录数:" + i.length)
}catch(SQLException e){
System.out.println("executeUpdateBatchError!")
System.out.println(e.getMessage())
return false
}
return true
}
*/
//进行数据库查询 *** 作
/*
public ResultSet executeQuery(String sql){
if(conn == null) createConnection()
try{
stmt = conn.createStatement()
rs = stmt.executeQuery(sql)
}catch(SQLException e){
System.out.println("executeQueryError!")
System.out.println(e.getMessage())
return null
}
return rs
}
*/
/*
public List executeQueryForList(String s) throws SQLException{
ResultSet rs = this.executeQuery(s)
List list = new ArrayList()
HashMap hash
String tmp = null
int cols = rs.getMetaData().getColumnCount()
while(rs.next()){
hash = new HashMap()
for(int i = 1i <= colsi++){
tmp = rs.getString(i)
if(tmp == null)
tmp = ""
hash.put(rs.getMetaData().getColumnName(i).toLowerCase(), tmp)
}
list.add(hash)
hash = null
}
return list
}
*/
/*
public HashMap executeQueryForMap(String s) throws SQLException{
ResultSet rs = this.executeQuery(s)
HashMap hash = new HashMap()
String tmp = null
int cols = rs.getMetaData().getColumnCount()
while(rs.next()){
hash = new HashMap()
for(int i = 1i <= colsi++){
tmp = rs.getString(i)
if(tmp == null)
tmp = ""
hash.put(rs.getMetaData().getColumnName(i).toLowerCase(), tmp)
}
}
return hash
}
*/
/*
public ResultSet executeQueryForPage(String sql){
if(conn == null) createConnection()
try{
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY)
rs = stmt.executeQuery(sql)
}catch(SQLException e){
System.out.println("executeQueryError!")
System.out.println(e.getMessage())
return null
}
return rs
}
*/
//对数据库 *** 作进行提交
/*
public boolean commit(){
try{
conn.commit()
}catch(SQLException e){
System.out.println("commitError!")
System.out.println(e.getMessage())
return false
}
return true
}
*/
//关闭数据库连接
public void closeDBConnection(){
if(conn != null){
try{
//stmt.close()
pstmt.close()
conn.close()
}catch(SQLException e){
System.out.println("closeDBConnectionError!")
e.printStackTrace()
}finally{
try{
//stmt.close()
pstmt.close()
}catch(SQLException e){
e.printStackTrace()
}
conn = null
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)