Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-dev] Sybase Connection logs in as guest in case of Connection communication failure

Thanks Tom. I have uploaded the proposed fix to the bug opened by me.
 
Thanks and appreciate your time.
Sridhar

--- On Fri, 9/30/11, Tom Ware <tom.ware@xxxxxxxxxx> wrote:

From: Tom Ware <tom.ware@xxxxxxxxxx>
Subject: Re: [eclipselink-dev] Sybase Connection logs in as guest in case of Connection communication failure
To: "sridhar baratam" <sridhar_baratam@xxxxxxxxx>
Cc: "Dev mailing list for Eclipse Persistence Services" <eclipselink-dev@xxxxxxxxxxx>
Date: Friday, September 30, 2011, 11:01 AM

Hi Sridhar,

  Please submit any patch you provide through the bug you entered (This is the only way the Eclipse foundation allows us to accept submitted code)

  The way we handle differences between databases is through our DatabasePlatform hierarchy.  (There is a SybasePlatform)  Rather than including an isSybase() check in code, we would have to delegate to the database platform somewhere in the call stack.

-Tom

sridhar baratam wrote:
> Hi Tom,
>  It appears this happens to be a documented behavior of Sybase where it connects as guest to master when the requested DB is not online. I found the following link on Sybase which talks about this behavior:
http://manuals.sybase.com/onlinebooks/group-as/asg1250e/svrtsg/@Generic__BookTextView/39281;pt=38808
>  That being said, I checked the code and came with this fix that fixes the problem. The change needs to be made in the connect() method in the org.eclipse.persistence.sessions.DefaultConnector.class
>
> Old Code:
> -------------
>         -
>         -
>         if (this.shouldUseDriverManager(properties, session)) {
>             try {
>                 return DriverManager.getConnection(this.getConnectionString(), properties);
>             } catch (SQLException sqlException) {
>                 driverManagerException = sqlException;
>                 if (session != null) {
>                     ((AbstractSession)session).log(SessionLog.FINER, SessionLog.CONNECTION, "connect_drivermanager_fail");
>                     ((AbstractSession)session).logThrowable(SessionLog.FINER, SessionLog.CONNECTION, sqlException);
>                 }
>             }
>         }
>         -
>         -
>  New Code:
> --------------
>         if (this.shouldUseDriverManager(properties, session)) {
>             try {
>                 //return DriverManager.getConnection(this.getConnectionString(), properties);
>                 Connection conn = DriverManager.getConnection(this.getConnectionString(), properties);
>                 // If DB is Sybase, check for warnings on the connection. Sybase is little strange
>                 // where it returns a connection as user guest if it is in the middle of startup with
>                 // the master db up but the target requested db is still waiting to come online. In this
>                 // case, Sybase returns warnings as part of the connection.
>                 if (getPlatform().isSybase()) {
>        SQLWarning warning = conn.getWarnings();
>        if (warning != null) {
>                    // Log SQL warning for tracking purposes
>                  if (session != null) {
>                      ((AbstractSession)session).log(SessionLog.FINER, SessionLog.CONNECTION, "SQL Warning: " + warning.getLocalizedMessage());
>                  }
>             conn.close();
>    // true flag below reflects Communication failure which forces the retry
>    throw DatabaseException.sqlException(exception, true);
>        }                                   }
>                 return conn;
>             } catch (SQLException sqlException) {
>                 driverManagerException = sqlException;
>                 if (session != null) {
>                     ((AbstractSession)session).log(SessionLog.FINER, SessionLog.CONNECTION, "connect_drivermanager_fail");
>                     ((AbstractSession)session).logThrowable(SessionLog.FINER, SessionLog.CONNECTION, sqlException);
>                 }
>             }
>         }
>  This fix is kind of generic in which it only checks for warnings coming from Sybase. Other database connections behavior will not be affected. I am not familar with the eclipseLink code and it should be reviewed by people knowledgable in this area.
>  Please let me know if you have additional questions.
>  Thanks
> Sridhar
>
>   
> --- On *Thu, 9/29/11, Tom Ware /<tom.ware@xxxxxxxxxx>/* wrote:
>
>
>     From: Tom Ware <tom.ware@xxxxxxxxxx>
>     Subject: Re: [eclipselink-dev] Sybase Connection logs in as guest in
>     case of Connection communication failure
>     To: "Tom Ware" <tom.ware@xxxxxxxxxx>
>     Cc: "sridhar baratam" <sridhar_baratam@xxxxxxxxx>, "Dev mailing list
>     for Eclipse Persistence Services" <eclipselink-dev@xxxxxxxxxxx>
>     Date: Thursday, September 29, 2011, 4:25 PM
>
>     BTW: I do see you suggestion about getting the warnings, but am
>     concerned about how we would do this in a generic way.  Parsing the
>     warning isn't a great answer here.
>
>     Tom Ware wrote:
>      > Hi Sridhar,
>      >
>      >   What do you think EclipseLink could do to resolve this?  We
>     don't have access to the logged message.  Is there a way configure
>     Sybase so this throws an exception instead?  Are you hoping we will
>     simply not try to reconnect and leave recovery to the application?
>      >
>      > -Tom
>      >
>      > sridhar baratam wrote:
>      >> Hi Tom,
>      >>  Thanks for the prompt reply. Here are the details:
>      >>  User "dbuser" has CRUD permissions on the AEDB database. I
>     connect to the application using this "dbuser".
>      >>  Here is my persistence.xml file:
>      >>  <?xml version="1.0" encoding="UTF-8"?>
>      >> <persistence version="2.0"
>     xmlns="http://java.sun.com/xml/ns/persistence"
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
>     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
>      >>  <persistence-unit name="JPA">
>      >>            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>                                    <class>com.sridhar.jpa.tutorial.Invoice</class>
>      >>         <class>com.sridhar.jpa.tutorial.Order</class>                   <class>com.sridhar.jpa.tutorial.Customer</class>
>      >>         <class>com.sridhar.jpa.tutorial.Product</class>
>      >>         <class>com.sridhar.jpa.tutorial.Person</class>
>      >>          <properties>
>      >>        <property name="javax.persistence.jdbc.driver"
>      >>                 value="com.sybase.jdbc3.jdbc.SybDriver"/>
>      >>             <property name="javax.persistence.jdbc.url"
>      >>                 value="jdbc:sybase:Tds:barsr01b:5000/AEDB"/>
>      >>             <property name="javax.persistence.jdbc.user"     value="dbuser"/>
>      >>             <property name="javax.persistence.jdbc.password"
>     value="dbuser"/>
>      >>              <!-- EclipseLink should create the database schema
>     automatically -->
>      >>    <!-- property name="eclipselink.ddl-generation"
>     value="drop-and-create-tables" />
>      >>    <property name="eclipselink.ddl-generation.output-mode"
>      >>     value="both" /-->
>      >>         <property name="eclipselink.logging.level" value="FINE"/>
>      >>         <property name="eclipselink.session.customizer"
>     value="com.sridhar.jpa.waae.custom.JPASessionCustomizer"/>
>      >>         <property name="eclipselink.jdbc.cache-statements"
>     value="true"/>                       </properties>  </persistence-unit>
>      >> </persistence>
>      >> I am running this module as a standalone application and not
>     using JTA. I set my logging level as fine and I believe that is why
>     we are able to see all the logging associated with user "dbuser" and
>     the exceptions caught/thrown internally within eclipselink.
>      >>  As I mentioned in the email, Sybase is a little different in
>     its behavior. When a connection is requested when Sybase is still
>     coming up and master being online, Sybase goes ahaead and connects
>     with user as "guest" thus giving a connection with "warnings". It
>     does not throw an exception.
>      >>  In the case that I ran into, the retry code within
>      >> org.eclipse.persistence.internal.sessions.AbstractSession
>     attempts to retry the query using retryQuery function on a
>     communication error and when Sybase comes up partially (only
>     recovering the master db), the following code within
>     org.eclipse.persistence.sessions.DefaultConnector.class returns a
>     connection without even checking for the warnings on the connection.
>      >>  try {
>      >>                 return
>     DriverManager.getConnection(this.getConnectionString(),
>      >> properties);
>      >>             } catch (SQLException sqlException) {
>      >>
>      >> The warning in this case would be:
>      >> "010DF: Attempt to set database at login failed. Error message:
>     Database 'AEDB' has not been recovered yet - please wait and try
>      >> again."
>      >>
>      >> It is very easy to recreate the problem using my test case. You
>     can change getOrders to someSelect function.
>      >>
>      >> Please let me know if you have additional questions.
>      >>  I really appreciate your time.
>      >> Thanks for all your help.
>      >> Sridhar
>      >>      >>
>      >> --- On *Thu, 9/29/11, Tom Ware /<tom.ware@xxxxxxxxxx
>     <http://us.mc655.mail.yahoo.com/mc/compose?to=tom.ware@xxxxxxxxxx>>/*
>     wrote:
>      >>
>      >>
>      >>     From: Tom Ware <tom.ware@xxxxxxxxxx
>     <http://us.mc655.mail.yahoo.com/mc/compose?to=tom.ware@xxxxxxxxxx>>
>      >>     Subject: Re: [eclipselink-dev] Sybase Connection logs in as
>     guest in
>      >>     case of Connection communication failure
>      >>     To: "Dev mailing list for Eclipse Persistence Services"
>      >>     <eclipselink-dev@xxxxxxxxxxx
>     <http://us.mc655.mail.yahoo.com/mc/compose?to=eclipselink-dev@xxxxxxxxxxx>>
>      >>     Date: Thursday, September 29, 2011, 11:32 AM
>      >>
>      >>     Hi Sridhar,
>      >>
>      >>       My first question is:
>      >>
>      >>     Where does the string "dbuser" come from.  I can't find
>     anywhere in
>      >>     the EclipseLink code that could accidentally be providing
>     that string.
>      >>
>      >>       How are you setting up your database connectivity?  What
>     does the
>      >>     persistence.xml for persistence unit "JPA" look like?
>      >>
>      >>     -Tom
>      >>
>      >>     sridhar baratam wrote:
>      >>      > Hello Gurus,
>      >>      >
>      >>      > I am trying to test the behavior of
>      >>     DelayBetweenConnectionAttempts on a Sybase Connection
>     communication
>      >>     behavior and running into problems. From what I have
>     experienced so
>      >>     far, when EclipseLink recovers from the communication link
>     failure,
>      >>     Sybase Connection gets logged in as user "guest" as opposed
>     to the
>      >>     original input user (which has the table read/write access) thus
>      >>     resulting in "SybSQLException Table not found" error.
>      >>      >
>      >>      > My test case was relatively simple:
>      >>      >
>      >>      > 1. Write a sample program which does the following:
>      >>      > - Call GetOrders()
>      >>      > - Sleep for 10 seconds
>      >>      > - Call GetOrders() again.
>      >>      >
>      >>      > While the program sleeps, stop the Sybase services and
>     restart
>      >>     the service. In the meantime, the program wakes up from sleep,
>      >>     determines a ConnectionException and kicks in the Connection
>     retry
>      >>     mechsnism using the DelayBetweenConnectionAttempts variable.
>     After a
>      >>     few attemps, EclipseLink recovers but almost 50% of the times,
>      >>     connects to the database as user guest thus resulting in a
>      >>     SybSQLException stating table not found.
>      >>      >
>      >>      > Here is my test module:
>      >>      > -----------------------
>      >>      > package com.sridhar.jpa.tutorial.test;
>      >>      >
>      >>      >
>      >>      > import java.sql.SQLException;
>      >>      > import java.util.Iterator;
>      >>      > import java.util.List;
>      >>      >
>      >>      > import javax.persistence.*;
>      >>      >
>      >>      > import com.sridhar.jpa.tutorial.Order;
>      >>      >
>      >>      >
>      >>      > public class RetryTest {
>      >>      >
>      >>      > public static void main(String[] args) {
>      >>      > EntityManagerFactory entityManagerFactory =
>      >>     Persistence.createEntityManagerFactory("JPA");
>      >>      >
>      >>      > getOrders(entityManagerFactory);
>      >>      > try {
>      >>      > System.out.println("Sleeping");
>      >>      > Thread.sleep(10000);
>      >>      > } catch (InterruptedException e) {
>      >>      > // TODO Auto-generated catch block
>      >>      > e.printStackTrace();
>      >>      > }
>      >>      > getOrders(entityManagerFactory);
>      >>      > entityManagerFactory.close();
>      >>      > }
>      >>      >
>      >>      > private static void getOrders(EntityManagerFactory
>      >>     entityManagerFactory) {
>      >>      > EntityManager em = null;
>      >>      > int retryCount = 0;
>      >>      > int masterRetry = 4;
>      >>      > do {
>      >>      > try {
>      >>      > System.out.println("Trying to create EM");
>      >>      > em = entityManagerFactory.createEntityManager();
>      >>      > em.getTransaction().begin();
>      >>      > System.out.println("Got one EM");
>      >>      > TypedQuery<Order> qry = em.createQuery("SELECT o FROM
>     ORDERS o",
>      >>     Order.class);
>      >>      > List<?> orderList = qry.getResultList();
>      >>      > System.out.println("Got query resultset");
>      >>      > Iterator<?> iter = orderList.iterator();
>      >>      > while (iter.hasNext()) {
>      >>      > Order order = (Order) iter.next();
>      >>      > System.out.println("order : " + order);
>      >>      > }
>      >>      > } catch (Exception e) {
>      >>      > System.out.println("Got an exception: " + e.getMessage());
>      >>      > retryCount++;
>      >>      > if (em != null)
>      >>      > {
>      >>      > java.sql.Connection connection =
>      >>     em.unwrap(java.sql.Connection.class);
>      >>      > try {
>      >>      > connection.close();
>      >>      > } catch (SQLException e1) {
>      >>      > // TODO Auto-generated catch block
>      >>      > e1.printStackTrace();
>      >>      > }
>      >>      >
>      >>      > em.close();
>      >>      > em = null;
>      >>      > }
>      >>      > System.out.println("Continuing the loop");
>      >>      > continue;
>      >>      > } finally {
>      >>      > if (em != null)
>      >>      > {
>      >>      > em.getTransaction().commit();
>      >>      > em.close();
>      >>      > em = null;
>      >>      > }
>      >>      > }
>      >>      > return;
>      >>      > } while (retryCount < masterRetry);
>      >>      > }
>      >>      > }
>      >>      >
>      >>        -------------------------------------------------------------------------------
>
>      >>      >
>      >>      > Here is the log information during the retry mechanims:
>      >>      > -------------------------------------------------------
>      >>      > [EL Info]: 2011-09-23
>      >>        16:51:29.072--ServerSession(29167060)--Thread(Thread[main,5,main])--EclipseLink,
>
>      >>     version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
>      >>      > [EL Fine]: 2011-09-23
>      >>     16:51:29.354--Thread(Thread[main,5,main])--Detected Vendor
>     platform:
>      >>     org.eclipse.persistence.platform.database.SybasePlatform
>      >>      > [EL Config]: 2011-09-23
>      >>        16:51:29.4--ServerSession(29167060)--Connection(27979955)--Thread(Thread[main,5,main])--connecting(DatabaseLogin(
>
>      >>      > platform=>SybasePlatform
>      >>      > user name=> "dbuser"
>      >>      > datasource URL="" "jdbc:sybase:Tds:barsr01b:5000/AEDB"
>      >>      > ))
>      >>      > [EL Config]: 2011-09-23
>      >>        16:51:29.463--ServerSession(29167060)--Connection(27296482)--Thread(Thread[main,5,main])--Connected:
>
>      >>     jdbc:sybase:Tds:barsr01b:5000/AEDB
>      >>      > User: dbuser
>      >>      > Database: Adaptive Server Enterprise Version: Adaptive Server
>      >>     Enterprise/15.0/EBF 12783 GA/P/NT (IX86)/Windows
>      >>     2000/ase150/2158/32-bit/OPT/Fri Aug 19 18:42:50 2005
>      >>      > Driver: jConnect (TM) for JDBC (TM) Version: jConnect
>     (TM) for
>      >>     JDBC(TM)/6.05(Build 25773)/P/EBF12723/JDK14/Fri Aug 5
>     0:05:43 2005
>      >>      > [EL Info]: 2011-09-23
>      >>        16:51:29.619--ServerSession(29167060)--Thread(Thread[main,5,main])--file:/C:/Vignesh-SPOG/JPA/build/classes/_JPA
>
>      >>     login successful
>      >>      > Got one EM
>      >>      > [EL Fine]: 2011-09-23
>      >>        16:51:30.354--ServerSession(29167060)--Connection(27296482)--Thread(Thread[main,5,main])--SELECT
>
>      >>     t1.PROD_ID, t1.REGULAR_PRICE, t1.PROD_DESC, t1.PROD_NAME,
>      >>     t1.LAST_UPDATED_TIME FROM ORDER_DETAIL t0, PRODUCT t1 WHERE
>      >>     ((t0.ORDER_ID = ?) AND (t1.PROD_ID = t0.PROD_ID))
>      >>      > bind => [111]
>      >>      > Got query resultset
>      >>      > order : orderId : 111 custId : 100 totPrice : 100.0
>     orderDesc :
>      >>     Internet and phone orderDt : Wed Sep 07 00:00:00 EDT 2011
>     invoice :
>      >>     orderId : 111 invoiceId : 1 amtDue : 100.0 orderRaisedDt :
>     Wed Sep
>      >>     07 00:00:00 EDT 2011 orderSettledDt : Wed Sep 07 00:00:00
>     EDT 2011
>      >>     orderCancelledDt : null updatedTime : Wed Sep 07 00:00:00
>     EDT 2011
>      >>      > order : orderId : 222 custId : 100 totPrice : 15.0
>     orderDesc :
>      >>     Cable at discounted price orderDt : Wed Sep 07 00:00:00 EDT 2011
>      >>     invoice : orderId : 222 invoiceId : 2 amtDue : 15.0
>     orderRaisedDt :
>      >>     Wed Sep 07 00:00:00 EDT 2011 orderSettledDt : Wed Sep 07
>     00:00:00
>      >>     EDT 2011 orderCancelledDt : Wed Sep 07 00:00:00 EDT 2011
>     updatedTime
>      >>     : Wed Sep 07 00:00:00 EDT 2011
>      >>      > order : orderId : 333 custId : 110 totPrice : 99.0
>     orderDesc : 3
>      >>     in one offer orderDt : Wed Sep 07 00:00:00 EDT 2011 invoice :
>      >>     orderId : 333 invoiceId : 3 amtDue : 99.0 orderRaisedDt :
>     Wed Sep 07
>      >>     00:00:00 EDT 2011 orderSettledDt : Wed Sep 07 00:00:00 EDT 2011
>      >>     orderCancelledDt : null updatedTime : Wed Sep 07 00:00:00
>     EDT 2011
>      >>      > Sleeping
>      >>      > Trying to create EM
>      >>      > Got one EM
>      >>      > Call: SELECT ORDER_ID, CUST_ID, OREDER_DESC, ORDER_DATE,
>      >>     TOTAL_PRICE, LAST_UPDATED_TIME FROM ORDERS
>      >>      > Query: ReadAllQuery(referenceClass=Order sql="SELECT
>     ORDER_ID,
>      >>     CUST_ID, OREDER_DESC, ORDER_DATE, TOTAL_PRICE, LAST_UPDATED_TIME
>      >>     FROM ORDERS").
>      >>      > [EL Config]: 2011-09-23
>      >>        16:51:40.416--ServerSession(29167060)--Connection(31637242)--Thread(Thread[main,5,main])--connecting(DatabaseLogin(
>
>      >>      > platform=>SybasePlatform
>      >>      > user name=> "dbuser"
>      >>      > datasource URL="" "jdbc:sybase:Tds:barsr01b:5000/AEDB"
>      >>      > ))
>      >>      > [EL Severe]: 2011-09-23
>      >>        16:51:42.307--ServerSession(29167060)--Thread(Thread[main,5,main])--Local
>      >>     Exception Stack:
>      >>      > Exception [EclipseLink-4002] (Eclipse Persistence Services -
>      >>     2.3.0.v20110604-r9504):
>      >>     org.eclipse.persistence.exceptions.DatabaseException
>      >>      > Internal Exception: java.sql.SQLException: JZ006: Caught
>      >>     IOException: java.net.ConnectException: Connection refused:
>     connect
>      >>      > Error Code: 0
>      >>      > at
>      >>        org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
>
>      >>      > at
>      >>        org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:319)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:138)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connectInternal(DatasourceAccessor.java:330)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.connectInternal(DatabaseAccessor.java:293)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.databaseaccess.DatasourceAccessor.connect(DatasourceAccessor.java:418)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.server.ConnectionPool.buildConnection(ConnectionPool.java:216)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.server.ConnectionPool.acquireConnection(ConnectionPool.java:135)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.server.ServerSession.getAccessors(ServerSession.java:534)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.server.ServerSession.executeCall(ServerSession.java:553)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:207)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:646)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2592)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2551)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:418)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1097)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:829)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1056)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:390)
>
>      >>      > at
>      >>        org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1144)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2863)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1501)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.AbstractSession.retryQuery(AbstractSession.java:1571)
>
>      >>      > at
>      >>        org.eclipse.persistence.sessions.server.ClientSession.retryQuery(ClientSession.java:593)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.retryQuery(UnitOfWorkImpl.java:5453)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1537)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1483)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1457)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:485)
>
>      >>      > at
>      >>        org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:742)
>
>      >>      > at
>      >>        com.sridhar.jpa.tutorial.test.RetryTest.getOrders(RetryTest.java:41)
>      >>      > at
>     com.sridhar.jpa.tutorial.test.RetryTest.main(RetryTest.java:26)
>      >>      > Caused by: java.sql.SQLException: JZ006: Caught IOException:
>      >>     java.net.ConnectException: Connection refused: connect
>      >>      > at com.sybase.jdbc3.jdbc.ErrorMessage.raiseError(Unknown
>     Source)
>      >>      > at
>     com.sybase.jdbc3.jdbc.ErrorMessage.raiseErrorCheckDead(Unknown
>      >>     Source)
>      >>      > at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
>      >>      > at com.sybase.jdbc3.tds.Tds.a(Unknown Source)
>      >>      > at com.sybase.jdbc3.tds.Tds.login(Unknown Source)
>      >>      > at com.sybase.jdbc3.jdbc.SybConnection.a(Unknown Source)
>      >>      > at com.sybase.jdbc3.jdbc.SybConnection.a(Unknown Source)
>      >>      > at com.sybase.jdbc3.jdbc.SybConnection.<init>(Unknown Source)
>      >>      > at com.sybase.jdbc3.jdbc.SybConnection.<init>(Unknown Source)
>      >>      > at com.sybase.jdbc3.jdbc.SybDriver.connect(Unknown Source)
>      >>      > at java.sql.DriverManager.getConnection(Unknown Source)
>      >>      > at java.sql.DriverManager.getConnection(Unknown Source)
>      >>      > at
>      >>        org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:98)
>
>      >>      > ... 32 more
>      >>      >
>      >>      > [EL Info]: 2011-09-23
>      >>        16:51:42.307--UnitOfWork(1635615)--Thread(Thread[main,5,main])--Communication
>
>      >>     failure detected when attempting to perform read query
>     outside of a
>      >>     transaction. Attempting to retry query. Error was: Exception
>      >>     [EclipseLink-4002] (Eclipse Persistence Services -
>      >>     2.3.0.v20110604-r9504):
>      >>     org.eclipse.persistence.exceptions.DatabaseException
>      >>      > Internal Exception: java.sql.SQLException: JZ006: Caught
>      >>     IOException: java.net.ConnectException: Connection refused:
>     connect
>      >>      > Error Code: 0
>      >>      > Query: ReadAllQuery(referenceClass=Order sql="SELECT
>     ORDER_ID,
>      >>     CUST_ID, OREDER_DESC, ORDER_DATE, TOTAL_PRICE, LAST_UPDATED_TIME
>      >>     FROM ORDERS").
>      >>      > [EL Config]: 2011-09-23
>      >>        16:51:52.322--ServerSession(29167060)--Connection(23257749)--Thread(Thread[main,5,main])--connecting(DatabaseLogin(
>
>      >>      > platform=>SybasePlatform
>      >>      > user name=> "dbuser"
>      >>      > datasource URL="" "jdbc:sybase:Tds:barsr01b:5000/AEDB"
>      >>      > ))
>      >>      > [EL Config]: 2011-09-23
>      >>        16:51:52.978--ServerSession(29167060)--Connection(8755816)--Thread(Thread[main,5,main])--Connected:
>
>      >>     jdbc:sybase:Tds:barsr01b:5000/AEDB
>      >>      > User: guest
>      >>      > Database: Adaptive Server Enterprise Version: Adaptive Server
>      >>     Enterprise/15.0/EBF 12783 GA/P/NT (IX86)/Windows
>      >>     2000/ase150/2158/32-bit/OPT/Fri Aug 19 18:42:50 2005
>      >>      > Driver: jConnect (TM) for JDBC (TM) Version: jConnect
>     (TM) for
>      >>     JDBC(TM)/6.05(Build 25773)/P/EBF12723/JDK14/Fri Aug 5
>     0:05:43 2005
>      >>      > [EL Fine]: 2011-09-23
>      >>        16:51:52.978--ServerSession(29167060)--Connection(8755816)--Thread(Thread[main,5,main])--SELECT
>
>      >>     ORDER_ID, CUST_ID, OREDER_DESC, ORDER_DATE, TOTAL_PRICE,
>      >>     LAST_UPDATED_TIME FROM ORDERS
>      >>      > [EL Fine]: 2011-09-23
>      >>        16:51:52.994--ServerSession(29167060)--Thread(Thread[main,5,main])--SELECT
>
>      >>     1
>      >>      > [EL Warning]: 2011-09-23
>      >>        16:51:52.994--UnitOfWork(1635615)--Thread(Thread[main,5,main])--Exception
>      >>     [EclipseLink-4002] (Eclipse Persistence Services -
>      >>     2.3.0.v20110604-r9504):
>      >>     org.eclipse.persistence.exceptions.DatabaseException
>      >>      > Internal Exception:
>     com.sybase.jdbc3.jdbc.SybSQLException: ORDERS
>      >>     not found. Specify owner.objectname or use sp_help to check
>     whether
>      >>     the object exists (sp_help may produce lots of output).
>      >>      >
>      >>      > Error Code: 208
>      >>      > Call: SELECT ORDER_ID, CUST_ID, OREDER_DESC, ORDER_DATE,
>      >>     TOTAL_PRICE, LAST_UPDATED_TIME FROM ORDERS
>      >>      > Query: ReadAllQuery(referenceClass=Order sql="SELECT
>     ORDER_ID,
>      >>     CUST_ID, OREDER_DESC, ORDER_DATE, TOTAL_PRICE, LAST_UPDATED_TIME
>      >>     FROM ORDERS")
>      >>      > Got an exception:
>      >>      > Internal Exception:
>     com.sybase.jdbc3.jdbc.SybSQLException: ORDERS
>      >>     not found. Specify owner.objectname or use sp_help to check
>     whether
>      >>     the object exists (sp_help may produce lots of output).
>      >>      >
>      >>        ------------------------------------------------------------------------------------
>
>      >>      >
>      >>      > As you could see from the log file above, the connection
>     recovers
>      >>     but as user "guest" thus resulting in a failure. I even tried
>      >>     closing the entity manager and that did not work. Later, I even
>      >>     tried to close the connection as well but that did not help
>     either.
>      >>      >
>      >>      > It appears that Sybase allows a connection to be
>     successful even
>      >>     when the user specifies an invalid database like:
>      >>      >
>      >>      > <property name="javax.persistence.jdbc.url"
>      >>      > value="jdbc:sybase:Tds:barsr01b:5000/XXXXXXXXXX"/>
>      >>      >
>      >>      > In this case, Sybase logins in an user guest going
>     against the
>      >>     master database but gives SQL warning on the same. From what
>     I can
>      >>     see, EclipseLink should catch the SQL warnings and fail the
>     connection.
>      >>      >
>      >>      > Here is how one can get the SQLWarnings:
>      >>      >
>      >>      > Properties props = new Properties();
>      >>      > props.setProperty("userName", user);
>      >>      > props.setProperty("password", pwd);
>      >>      >
>      >>      > m_con = DriverManager.getConnection(url, user, pwd);
>      >>      > SQLWarning warning = m_con.getWarnings();
>      >>      > if (warning != null) {
>      >>      > logger.log(Level.SEVERE, "SQLWarning: ");
>      >>      > logger.log(Level.SEVERE, warning.getLocalizedMessage());
>      >>      > ErrorStack.addError(warning.getLocalizedMessage());
>      >>      > m_con.close();
>      >>      > return;
>      >>      > }
>      >>      >
>      >>      > I appreciate all the help.
>      >>      >
>      >>      > Thanks
>      >>      > Sridhar
>      >>      >
>      >>      >
>      >>      >
>      >>        ------------------------------------------------------------------------
>      >>      >
>      >>      > _______________________________________________
>      >>      > eclipselink-dev mailing list
>      >>      > eclipselink-dev@xxxxxxxxxxx
>     <http://us.mc655.mail.yahoo.com/mc/compose?to=eclipselink-dev@xxxxxxxxxxx>
>      >>        <http://us.mc655.mail.yahoo.com/mc/compose?to=eclipselink-dev@xxxxxxxxxxx>
>
>      >>      > https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
>      >>     _______________________________________________
>      >>     eclipselink-dev mailing list
>      >>     eclipselink-dev@xxxxxxxxxxx
>     <http://us.mc655.mail.yahoo.com/mc/compose?to=eclipselink-dev@xxxxxxxxxxx>
>      >>        <http://us.mc655.mail.yahoo.com/mc/compose?to=eclipselink-dev@xxxxxxxxxxx>
>
>      >>     https://dev.eclipse.org/mailman/listinfo/eclipselink-dev
>      >>
>      >
>

Back to the top