Need help with JDBC code walk
Hello Everyone
I am in a soup again :) I have a java class called SessionManager. As
its name implies, it keeps track of session.getAttribute and
session.setAttribute calls from a webserver (actually JSF + JBOSS
which is another nightmare :).
This is the crux: when I take away the JDBC calls everything works
fine except for the session persistence between server reboots. I
looked very hard and long at the code for almost a week now. Problem
is it works some times. I am unable to determine any pattern as to
what causes the code to fail. Could it be serialization of objects in/
out of Mysql? To go through every object that is ever put into a
session, it is a very lengthy task given that I am maintaining the
code (am not the writer of JSF back end beans).
I looked into some session persistence solutions (can't remember off
hand) and found them to be useful for a new project. Even using
hibernate is not an option for me. Since I already worked on this code
for several weeks now and the fact that it works some times, makes me
an optimist. :) Please help me out if you can.
BTW, these are the versions: jvm 1.5, jboss 4.0.2, Windows XP
Imports not shown... no compile problems....run time errors like
objects returned null; Typically the select component of JSF gets a
null enumeration.
Thanks
/**
* This class provides methods to interact with the session. Its
exposes methods to put and get objects into
* Session and also exposes methods to do cleanup.
* @author rajasekhark
*/
public class SessionManager {
/**
* Sets an attribute in the session. These attributes would be
independent of the module,
* and would be removed when the session expires. Or
<code>flush(HttpSession session)</code>
* is called in the session.
* @param key
* @param value
* @param session
* @throws InvalidParameterException
*/
public static void setAttribute(String key, Object value,
HttpSession session)
throws InvalidParameterException{
if (value == null) {
System.out.println("***********set attribute value null");
System.exit(0);
}
String sessid = (String)session.getId();
System.out.println("sessionid=" + sessid);
//open db connection and save attribute if UID is set
UserContext ucon = (UserContext)
session.getAttribute(FrameworkConstants.UserContextKey);
String uid="";
if (ucon != null)
uid=ucon.getUid();
String uname="";
if (ucon != null) uname=ucon.getStrUserName();
if (uname == null) uname="";
System.out.println("SET ATTRIBUTE ******************uid=" + uid + "
uname=" + uname);
if (!sessid.equals("notset") && uid !=null && !uid.equals("")) {
Connection conn = null;
ResultSet rs=null;
PreparedStatement ps=null;
try
{
String userName = "jboss";
String password = "*********";
String url = "jdbc:mysql://localhost:3306/jsfsession";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName,
password);
System.out.println ("Setattribute Database connection
established for key=" + key);
ps = conn.prepareStatement("update session_tbl set val=?,
datestamp=NOW() where keyid=? and sessid=?");
ps.setString(3, sessid);
System.out.println("sessid=" + sessid);
System.out.println("userid=" + uid);
ps.setString(2, key);
System.out.println("key=" + key);
ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
ObjectOutputStream oout1 = new ObjectOutputStream(baos1);
oout1.writeObject(value);
oout1.close();
ps.setBytes(1, baos1.toByteArray());
//ps.setObject(1, value);
System.out.println("set blob");
int r=ps.executeUpdate();
ps.close();
if (r==0) {
System.out.println("can't update");
ps = conn.prepareStatement("insert into session_tbl (sessid, uid,
keyid, val, uname, datestamp) values (?, ?, ?, ?, ?, NOW())");
ps.setString(1, sessid);
System.out.println("uid=" + uid);
ps.setString(2, uid);
ps.setString(3, key);
System.out.println("key=" + key);
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
ObjectOutputStream oout2 = new ObjectOutputStream(baos2);
oout2.writeObject(value);
oout2.close();
ps.setBytes(4, baos2.toByteArray());
//ps.setObject(4, value);
System.out.println("set blob");
ps.setString(5, uname);
ps.executeUpdate();
System.out.println("insert successful");
}
ps.close();
}
catch (Exception e)
{
System.err.println ("Cannot connect to database server"
+ e.getMessage());
}
finally
{
if (ps != null) {
try {
ps.close();
} catch (Exception e2) {};
}
if (conn != null)
{
try
{
conn.close ();
System.out.println ("Setattribute Database
connection terminated");
}
catch (Exception e) { /* ignore close errors */ }
}
}
} //if
try{
//checks if the key is null or empty. Throws an exception if
it is.
if(null == key || "" == key){
Object [] values = new Object[1];
values[0] = "key";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//checks if the session is null or empty. Throws an
exception if it is.
if(null == session){
Object [] values = new Object[1];
values[0] = "session";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//set the session attribute
session.setAttribute(key, value);
System.out.println("setting attr in session key=" + key + " value="
+ value);
}catch(RuntimeException ex){
throw new InvalidParameterException(ex);
}//end-try-catch
System.out.println("leaving set attribute");
}//end setAttribute
/**
* Sets an attribute in the session. These attribute pattern would
be the module name, and would
* be removed when the session expires. Or <code>flush(String
pattern, HttpSession session)</code>
* is called in the session.
* @param pattern
* @param key
* @param value
* @param session
* @throws InvalidParameterException
*/
public static void setPatternedAttribute(String pattern, String key,
Object value, HttpSession session)
throws
InvalidParameterException{
System.out.println("entered set patterned attribute");
try{
//checks if the key is null or empty. Throws an exception if
it is.
if(null == key || "" == key){
Object [] values = new Object[1];
values[0] = "key";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//checks if the session is null or empty. Throws an
exception if it is.
if(null == session){
Object [] values = new Object[1];
values[0] = "session";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//set the session attribute
session.setAttribute(pattern + "_" + key, value);
System.out.println("setting pattern=" + pattern + " key=" + key + "
value=" + value);
}catch(RuntimeException ex){
throw new InvalidParameterException(ex);
}//end-try-catch
}
/**
* Gets the value corresponding to the key passed as parameter. It
iterates through all the
* available keys in the session, locates the key passed as
parameter. If found it passes the
* corresponding value, else it throws appropriate exception.
* @param key
* @param session
* @return Object
* @throws InvalidParameterException
* @throws SessionKeyNotFoundException
*/
public static Object getAttribute(String key, HttpSession session)
throws
InvalidParameterException,
SessionKeyNotFoundException{
System.out.println("entered get attribute*********");
String uid="";
UserContext ucon = (UserContext)
session.getAttribute(FrameworkConstants.UserContextKey);
String sessid="notset";
if (ucon != null)
uid=ucon.getUid();
System.out.println("*********uid=" + uid);
sessid=(String)session.getId();
System.out.println("session =" + sessid);
Enumeration enumSessionKeys = null;
Object returnValue = null;
boolean bKeyFound = false;
try{
//checks if the key is null or empty. Throws an exception if
it is.
if(null == key || key.equals("")){
Object [] values = new Object[1];
values[0] = "key";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//checks if the session is null or empty. Throws an
exception if it is.
if(null == session){
Object [] values = new Object[1];
values[0] = "session";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//Get all the keys available in session.
enumSessionKeys = session.getAttributeNames();
//Iterate through all the keys in the enumSessionKeys
enumeration. If the key
//is found populate returnValue with the corresponding
session value and set the
//key found flag to true. The first if checks for those
attributes that are set
//based on a key without a pattern. The second if is for the
attributes that are
//set in the session based on a pattern.
while(enumSessionKeys.hasMoreElements()){
if (key.indexOf("userContext") > -1) break;
String strCurrentKey =
(String)enumSessionKeys.nextElement();
CharSequence keySeq = key.subSequence(0, key.length());
System.out.println("keyinput=" + key + "keyseq=" +
keySeq + " strCurrentKey=<" + strCurrentKey + ">value=<" +
session.getAttribute(strCurrentKey));
if((strCurrentKey).equals(key)){
returnValue = session.getAttribute(key);
bKeyFound = true;
System.out.println("match1");
break;
}//end-if
else if(strCurrentKey.endsWith(key)){
returnValue = session.getAttribute(strCurrentKey);
bKeyFound = true;
System.out.println("match2");
break;
}//end-else-if
else if((strCurrentKey).contains(keySeq)){
returnValue = session.getAttribute(strCurrentKey);
bKeyFound = true;
System.out.println("match3");
break;
}//end-else-if
}
if (bKeyFound) {
System.out.println("Key = " + key + " is found");
if (returnValue != null) return returnValue;
} else {
System.out.println("key=" + key + " not found");
}
//
//open db connection and save attribute IF the attribute is not
found
if ( !sessid.equals("notset") ) {
Connection conn = null;
ResultSet rs=null;
PreparedStatement ps=null;
try
{
String userName = "jboss";
String password = "**************";
String url = "jdbc:mysql://localhost:3306/jsfsession";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName,
password);
System.out.println ("Getattribute Database connection
established. looking for key=" + key);
ps = conn.prepareStatement("select val from session_tbl where
keyid ='" + key + "' and sessid=? order by datestamp ASC");
ps.setString(1, sessid);
//ps.setString(1, strCurrentKey);
rs=ps.executeQuery();
if (rs.next()) {
bKeyFound=true;
System.out.println("Found it!");
byte[] buf = rs.getBytes("val");
if (buf != null) {
System.out.println("buf not null in getattribute***********");
ObjectInputStream objectIn = new ObjectInputStream(
new ByteArrayInputStream(buf));
returnValue = objectIn.readObject(); //Contains the object
}
//returnValue = rs.getObject("val");
}
rs.close();
ps.close();
if (!bKeyFound) {
ps = conn.prepareStatement("select val from session_tbl where keyid
like '%" + key + "' and sessid=? order by datestamp ASC");
ps.setString(1, sessid);
//ps.setString(1, strCurrentKey);
rs=ps.executeQuery();
if (rs.next()) {
bKeyFound=true;
System.out.println("Found it!");
byte[] buf = rs.getBytes("val");
if (buf != null) {
System.out.println("buf not null in getattribute***********");
ObjectInputStream objectIn = new ObjectInputStream(
new ByteArrayInputStream(buf));
returnValue = objectIn.readObject(); //Contains the object
}
//returnValue = rs.getObject("val");
}
rs.close();
ps.close();
}//if
if (!bKeyFound) {
ps = conn.prepareStatement("select val from session_tbl where
(keyid like '%" + key + "%' or keyid like '%" + key + "' or keyid like
'%" + key + "%') and sessid=? order by datestamp ASC");
ps.setString(1, sessid);
//ps.setString(1, strCurrentKey);
rs=ps.executeQuery();
if (rs.next()) {
bKeyFound=true;
System.out.println("Found it!");
byte[] buf = rs.getBytes("val");
if (buf != null) {
System.out.println("buf not null in getattribute***********");
ObjectInputStream objectIn = new ObjectInputStream(
new ByteArrayInputStream(buf));
returnValue = objectIn.readObject(); //Contains the object
}
//returnValue = rs.getObject("val");
}
rs.close();
ps.close();
}//if
}
catch (Exception e)
{
System.err.println ("Cannot connect to database server"
+ e.getMessage());
}
finally
{
try {
rs.close();
} catch (Exception e3) {};
if (ps != null) {
try {
ps.close();
} catch (Exception e2) {};
}
if (conn != null)
{
try
{
conn.close ();
System.out.println ("Getattribute Database
connection terminated");
}
catch (Exception e) { /* ignore close errors */ }
}
}
}//if
if (bKeyFound) {
setAttribute(key, returnValue, session);
}
//check if the key found flag is set to true. if not then throw
SessionKeyNotFoundException.
if(!bKeyFound || returnValue == null ){
Object [] values = new Object[1];
values[0] = key;
System.out.println("SessionManager about to throw
SessionKeyNotFoundException key="+key);
throw new
SessionKeyNotFoundException("SessionKeyNotFoundException", values);
}//end-if
return returnValue;
}catch(RuntimeException ex){
throw new InvalidParameterException(ex);
}//end-try-catch
}//end getAttribute
/**
* Removes the keys that follow a specified pattern (specified in
the input) from the session.
* @param pattern
* @param session
* @throws InvalidParameterException
*/
public static void flush(String pattern, HttpSession session)
throws InvalidParameterException{
System.out.println("entered session flush");
Enumeration enumSessionKeys = null; //enumeration that will hold
all the keys in the session.
String key = ""; //key arrived while iterating.
try{
//checks if the key is null or empty. Throws an exception if
it is.
if(null == pattern || "" == pattern){
Object [] values = new Object[1];
values[0] = "pattern";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//checks if the session is null or empty. Throws an
exception if it is.
if(null == session){
Object [] values = new Object[1];
values[0] = "session";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
//Get all the keys available in session.
enumSessionKeys = session.getAttributeNames();
//if the attributes in the session are not null, iterate
through all the available
//keys and check if the pattern passed as input matches the
current key. If so then
//remove the key from the session.
if(null != enumSessionKeys){
while(enumSessionKeys.hasMoreElements()){
key = (String)enumSessionKeys.nextElement();
if(key.startsWith(pattern)) {
session.removeAttribute(key);
System.out.println("flush remove attrib=" + key);
}//end-if
}//end-while
}//end-if
}catch(RuntimeException ex){
throw new InvalidParameterException(ex);
}//end-try-catch
System.out.println("leaving sessioni flush");
}//end-flush
/**
* Invalidates the entire session.
* @param session
* @throws InvalidParameterException
*/
public static void flush(HttpSession session)
throws InvalidParameterException{
System.out.println("entered flush2");
Enumeration enumSessionKeys = null;
String key = ""; //key arrived while iterating.
try{
//checks if the session is null or empty. Throws an
exception if it is.
if(null == session){
Object [] values = new Object[1];
values[0] = "session";
throw new
InvalidParameterException("InvalidParameterException",values);
}//end-if
session.invalidate();
}catch(RuntimeException ex){
throw new InvalidParameterException(ex);
}//end-try-catch
System.out.println("Leafving flush2");
}//end-flush
public static void fflush(HttpSession session)
throws InvalidParameterException{
System.out.println("*****************entered fflush2");
String sessid="notset";
//if (ucon != null)
//uid=ucon.getUid();
sessid=(String)session.getId();
System.out.println("sessionid=" + sessid);
Connection conn = null;
ResultSet rs=null;
PreparedStatement ps=null;
try
{
String userName = "jboss";
String password = "*************";
String url = "jdbc:mysql://localhost:3306/jsfsession";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName,
password);
System.out.println ("Getattribute Database connection
established");
ps=conn.prepareStatement("select uid from session_tbl where
sessid=?");
ps.setString(1, sessid);
rs=ps.executeQuery();
String uid="";
if (rs.next()) {
uid=rs.getString("uid");
}
rs.close();
if (uid != null && !uid.equals("")) {
System.out.println("**********removing session for uid=" + uid);
//UserManager.removeff(uid);
}
ps.close();
ps = conn.prepareStatement("delete from session_tbl where
sessid=?");
ps.setString(1, sessid);
ps.executeUpdate();
ps.close();
}
catch (Exception e)
{
System.err.println ("Cannot connect to database server"
+ e.getMessage());
}
finally
{
try {
rs.close();
} catch (Exception e3) {};
if (ps != null) {
try {
ps.close();
} catch (Exception e2) {};
}
if (conn != null)
{
try
{
conn.close ();
System.out.println ("Getattribute Database
connection terminated");
}
catch (Exception e) { /* ignore close errors */ }
}
}
System.out.println("*****************Leafving fflush2");
}//end-flush
public static void fflushbyuserid(String uname, String uid)
throws InvalidParameterException{
System.out.println("*****************entered fflush2 for user=" +
uname);
Connection conn = null;
ResultSet rs=null;
PreparedStatement ps=null;
try
{
String userName = "jboss";
String password = "******";
String url = "jdbc:mysql://localhost:3306/jsfsession";
Class.forName ("com.mysql.jdbc.Driver").newInstance ();
conn = DriverManager.getConnection (url, userName,
password);
System.out.println ("Getattribute Database connection
established");
/*******************
ps=conn.prepareStatement("select uid from session_tbl where uname=?");
ps.setString(1, uname);
rs=ps.executeQuery();
String nuid="";
if (rs.next()) {
nuid=rs.getString("uid");
}
rs.close();
ps.close();
ps = conn.prepareStatement("delete from session_tbl where
uname=?");
ps.setString(1, uname);
ps.executeUpdate();
ps.close();
*************************/
if (uid != null && !uid.equals(""))
UserManager.removeff(uid);
}
catch (Exception e)
{
System.err.println ("Cannot connect to database server"
+ e.getMessage());
}
finally
{
try {
rs.close();
} catch (Exception e3) {};
if (ps != null) {
try {
ps.close();
} catch (Exception e2) {};
}
if (conn != null)
{
try
{
conn.close ();
System.out.println ("Getattribute Database
connection terminated");
}
catch (Exception e) { /* ignore close errors */ }
}
}
System.out.println("*****************Leafving fflushbyuserid");
}//end-flush
}