📄 jdbcstore.java
字号:
}
/**
* Remove the Session with the specified session identifier from
* this Store, if present. If no such Session is present, this method
* takes no action.
*
* @param id Session identifier of the Session to be removed
*
* @exception IOException if an input/output error occurs
*/
public void remove(String id) throws IOException {
String removeSql =
"DELETE FROM " + sessionTable + " WHERE " + sessionIdCol +
" = ? AND " + sessionAppCol + " = ?";
synchronized (this) {
int numberOfTries = 2;
while (numberOfTries > 0) {
Connection _conn = getConnection();
if (_conn == null) {
return;
}
try {
if (preparedRemoveSql == null) {
preparedRemoveSql = _conn.prepareStatement(removeSql);
}
preparedRemoveSql.setString(1, id);
preparedRemoveSql.setString(2, getName());
preparedRemoveSql.execute();
} catch (SQLException e) {
log(sm.getString(getStoreName() + ".SQLException", e));
if (dbConnection != null)
close(dbConnection);
} finally {
release(_conn);
}
numberOfTries--;
}
}
if (debug > 0) {
log(sm.getString(getStoreName() + ".removing", id, sessionTable));
}
}
/**
* Remove all of the Sessions in this Store.
*
* @exception IOException if an input/output error occurs
*/
public void clear() throws IOException {
String clearSql =
"DELETE FROM " + sessionTable + " WHERE " + sessionAppCol + " = ?";
synchronized (this) {
int numberOfTries = 2;
while (numberOfTries > 0) {
Connection _conn = getConnection();
if (_conn == null) {
return;
}
try {
if (preparedClearSql == null) {
preparedClearSql = _conn.prepareStatement(clearSql);
}
preparedClearSql.setString(1, getName());
preparedClearSql.execute();
} catch (SQLException e) {
log(sm.getString(getStoreName() + ".SQLException", e));
if (dbConnection != null)
close(dbConnection);
} finally {
release(_conn);
}
numberOfTries--;
}
}
}
/**
* Save a session to the Store.
*
* @param session the session to be stored
* @exception IOException if an input/output error occurs
*/
public void save(Session session) throws IOException {
String saveSql =
"INSERT INTO " + sessionTable + " (" + sessionIdCol + ", " +
sessionAppCol + ", " +
sessionDataCol + ", " +
sessionValidCol + ", " +
sessionMaxInactiveCol + ", " +
sessionLastAccessedCol + ") VALUES (?, ?, ?, ?, ?, ?)";
ObjectOutputStream oos = null;
ByteArrayOutputStream bos = null;
ByteArrayInputStream bis = null;
InputStream in = null;
synchronized (this) {
int numberOfTries = 2;
while (numberOfTries > 0) {
Connection _conn = getConnection();
if (_conn == null) {
return;
}
// If sessions already exist in DB, remove and insert again.
// TODO:
// * Check if ID exists in database and if so use UPDATE.
remove(session.getId());
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(new BufferedOutputStream(bos));
((StandardSession) session).writeObjectData(oos);
oos.close();
oos = null;
byte[] obs = bos.toByteArray();
int size = obs.length;
bis = new ByteArrayInputStream(obs, 0, size);
in = new BufferedInputStream(bis, size);
if (preparedSaveSql == null) {
preparedSaveSql = _conn.prepareStatement(saveSql);
}
preparedSaveSql.setString(1, session.getId());
preparedSaveSql.setString(2, getName());
preparedSaveSql.setBinaryStream(3, in, size);
preparedSaveSql.setString(4, session.isValid() ? "1" : "0");
preparedSaveSql.setInt(5, session.getMaxInactiveInterval());
preparedSaveSql.setLong(6, session.getLastAccessedTime());
preparedSaveSql.execute();
} catch (SQLException e) {
log(sm.getString(getStoreName() + ".SQLException", e));
if (dbConnection != null)
close(dbConnection);
} catch (IOException e) {
;
} finally {
if (oos != null) {
oos.close();
}
if (bis != null) {
bis.close();
}
if (in != null) {
in.close();
}
release(_conn);
}
numberOfTries--;
}
}
if (debug > 0) {
log(sm.getString(getStoreName() + ".saving",
session.getId(), sessionTable));
}
}
// --------------------------------------------------------- Protected Methods
/**
* Check the connection associated with this store, if it's
* <code>null</code> or closed try to reopen it.
* Returns <code>null</code> if the connection could not be established.
*
* @return <code>Connection</code> if the connection suceeded
*/
protected Connection getConnection() {
try {
if (dbConnection == null || dbConnection.isClosed()) {
log(sm.getString(getStoreName() + ".checkConnectionDBClosed"));
open();
if (dbConnection == null || dbConnection.isClosed()) {
log(sm.getString(getStoreName() + ".checkConnectionDBReOpenFail"));
}
}
} catch (SQLException ex) {
log(sm.getString(getStoreName() + ".checkConnectionSQLException",
ex.toString()));
}
return dbConnection;
}
/**
* Open (if necessary) and return a database connection for use by
* this Realm.
*
* @exception SQLException if a database error occurs
*/
protected Connection open() throws SQLException {
// Do nothing if there is a database connection already open
if (dbConnection != null)
return (dbConnection);
// Instantiate our database driver if necessary
if (driver == null) {
try {
Class clazz = Class.forName(driverName);
driver = (Driver) clazz.newInstance();
} catch (ClassNotFoundException ex) {
log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException",
ex.toString()));
} catch (InstantiationException ex) {
log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException",
ex.toString()));
} catch (IllegalAccessException ex) {
log(sm.getString(getStoreName() + ".checkConnectionClassNotFoundException",
ex.toString()));
}
}
// Open a new connection
Properties props = new Properties();
if (connectionName != null)
props.put("user", connectionName);
if (connectionPassword != null)
props.put("password", connectionPassword);
dbConnection = driver.connect(connectionURL, props);
dbConnection.setAutoCommit(true);
return (dbConnection);
}
/**
* Close the specified database connection.
*
* @param dbConnection The connection to be closed
*/
protected void close(Connection dbConnection) {
// Do nothing if the database connection is already closed
if (dbConnection == null)
return;
// Close our prepared statements (if any)
try {
preparedSizeSql.close();
} catch (Throwable f) {
;
}
this.preparedSizeSql = null;
try {
preparedKeysSql.close();
} catch (Throwable f) {
;
}
this.preparedKeysSql = null;
try {
preparedSaveSql.close();
} catch (Throwable f) {
;
}
this.preparedSaveSql = null;
try {
preparedClearSql.close();
} catch (Throwable f) {
;
}
this.preparedClearSql = null;
try {
preparedRemoveSql.close();
} catch (Throwable f) {
;
}
this.preparedRemoveSql = null;
try {
preparedLoadSql.close();
} catch (Throwable f) {
;
}
this.preparedLoadSql = null;
// Close this database connection, and log any errors
try {
dbConnection.close();
} catch (SQLException e) {
log(sm.getString(getStoreName() + ".close", e.toString())); // Just log it here
} finally {
this.dbConnection = null;
}
}
/**
* Release the connection, not needed here since the
* connection is not associated with a connection pool.
*
* @param conn The connection to be released
*/
protected void release(Connection conn) {
;
}
/**
* Called once when this Store is first started.
*/
public void start() throws LifecycleException {
super.start();
// Open connection to the database
this.dbConnection = getConnection();
}
/**
* Gracefully terminate everything associated with our db.
* Called once when this Store is stoping.
*
*/
public void stop() throws LifecycleException {
super.stop();
// Close and release everything associated with our db.
if (dbConnection != null) {
try {
dbConnection.commit();
} catch (SQLException e) {
;
}
close(dbConnection);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -