Hi again,

this sounds great!

I propose to add the associated JdbcConnectionDescriptor
as argument too

>=========================
>ConnectionValidator.java
>=========================
>package org.apache.ojb.broker.accesslayer;
>
>public interface ConnectionValidator
>{
>    public boolean isValid(JdbcConnectionDescriptor jcd, Connection conn);
>}
>
>
then it's possible to lookup the org.apache.ojb.broker.platforms.Platform
implementation for the used RDBMS in the ConnectionValidator implementation.


In Platform interface we can add a "String defaultValidationQuery()" method
and in the implemetation classes we build queries against e.g. a DB system table
or return null if not supported. Then it will be easy to build some sort of
base ConnectionValidator.


What do you think?

regards,
Armin


On Fri, 17 Oct 2003 12:36:22 -0400, Justis Peters <[EMAIL PROTECTED]> wrote:


Hi Armin,

Armin Waibel [EMAIL PROTECTED] wrote:
On Fri, 17 Oct 2003 11:54:56 -0400, Justis Peters <[EMAIL PROTECTED]>
wrote:
>Could we handle this by defining an interface and allowing users to
>specify their own tester class?  Here is what I am picturing:
>
yes this will be possible, but can you describe
what's the advantage of this solution?
Simply that it allows more flexibility in how the test is implemented. We would probably ship an implementation with OJB that used the current method (of running a query) and would take an attribute that specified the validation query. Perhaps we could also add some sort of string or regex to which the results would be compared ( for validation ). This is just one implementation, though.


And how can we reduce validation query calls?
This would be up to the individual implementations of ConnectionValidator. My first thought is that people could implement specific tests for the situations they worry about (like a server restart). Here are some other ideas, though:
- Wrap the connection in a decorator that stores information about how many times it has been used, or how long it has been since it was last validated. There could be a special ConnectionValidator that checked for these types of Connection objects, and if detected, would validate less often. These attributes could be set in the "connection-validator" element. For example, you could ask that it only validate every 2 seconds. (I haven't thought through this whole scenario, but I think you would have to specify a different ConnectionFactory as well, to get these decorated Connection objects).
- Check the Connection to see if (conn.getWarnings != null). Run the validation query only if this is true.
- Do platform specific checks, like looking to see if the server port for your database is even listening.


Mostly, though, I am just hoping that opening this up to an interface will encourage people to write their own implementations. A number of users who don't have time to get deep into the code and submit patches would actually have the time to implement a simple interface. Perhaps some innovation would come from the user community by having this hook available?

Or do you see an alternative way to check the connection?
In the case that Andrew was asking about, he could add some sort of hook that listens for database server restarts and considers all database connections that existed previously to be invalid. Maybe he could do it with a JMX hook? In this case, though, it seems somewhat unintuitive to have the ConnectionValidator wait for the dead connections to come in. It would be better (for his case, at least) to be able to simply call a method on the connection pool that allows him to flush all the existing connections.


Any thoughts on all this? My idea is mainly to open up for innovation, by including an interface. I don't have any direct solutions yet. Looking forward to hearing your response.


Sincerely yours,
Justis Peters
Oculan Corp.
[EMAIL PROTECTED]


>=========================
>ConnectionValidator.java
>=========================
>package org.apache.ojb.broker.accesslayer;
>
>public interface ConnectionValidator
>{
> public boolean isValid(java.sql.Connection conn);
>}
>
>
>=========================
>repository_database.xml
>=========================
><jdbc-connection-descriptor jcd-alias="default"
>driver="org.postgresql.Driver" etc... >
>
> <connection-pool maxActive="51" testOnBorrow="true"
>testOnReturn="false" removeAbandoned="true">
> <connection-validator
>className="com.mydomain.ojbutils.PostgresConnectionValidator">
> <attribute attribute-name="foo" attribute-value="testvalue1"
>/>
> <attribute attribute-name="bar" attribute-value="testvalue2"
>/>
> </connection-validator>
> </connection-pool>
>
> <sequence-manager
>className="org.apache.ojb.broker.util.sequence.SequenceManagerNextValImpl">
> <attribute attribute-name="autoNaming" attribute-value="false" />
> </sequence-manager>
></jdbc-connection-descriptor>
>
>====================================================
>
>Thoughts?
>
>Sincerely yours,
>Justis Peters
>Oculan Corp.
>[EMAIL PROTECTED]
>
>
>Armin Waibel [EMAIL PROTECTED] wrote:
>>Hi Andrew,
>>
>>you can use the 'validationQuery' attribute of connection-pool
>>element to specify a validation query. This query will be executed
>>each time before a connection was delivered by the pool.
>>
>>Any proposals to make this more sophisticated are
>>welcome.
>>
>>regards,
>>Armin
>>
>>On Fri, 17 Oct 2003 11:20:02 -0400, Clute, Andrew
>><[EMAIL PROTECTED]> wrote:
>>
>>>I apologized in advance for the increase in mail traffic today. I have
>>>checked the archives for an answer to this, to no avail.
>>>
>>>I am seeing, as expected, if our Database has been restarted that any
>>db
>>>connections in the pool as becoming invalid. I understand how this is
>>>happening -- the connection doesn't realize the socket connection has
>>>been
>>>reset, and so it fails to persist any data. I have simulated the
>>>situation,
>>>and I can see the connection when it is retrieved from the pool is
>>still
>>>marked as active.
>>>
>>>I am using ConnectionFactoryPooledImpl. What seems odd to me, is it
>>never
>>>self-corrects. It looks to me like when the connection failed, it is
>>>still
>>>in the pool, and I never get a valid connection.
>>>
>>>OJB is being used by EJB's sitting in Jboss. I am not using OJB as a
>>>deployed EJB, but calling directly. I am also not using a DataSource
>>>inside
>>>of Jboss, but instead the connection pool from OJB.
>>>
>>>It seems to me using the pooled connections, that when the database is
>>>restarted, then I have to take down my Jboss server and restart it to
>>>refresh the pool. Am I missing something here? Now, I could use no
>>pool,
>>>and
>>>then the problem never arises. Would using the DataSource from jBoss
>>and
>>>ConnectionFactoryManagedImpl make it better.
>>>
>>>What should me expectations be for db connections when the database has
>>>been
>>>restarted? (Bigger issue here is our SQL Server cluster -- all the
>>>connections become invalid when the server fails over to a different
>>>server).
>>>
>>>-Andrew
>>>
>>>
>>>---------------------------------------------------------------------
>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>
>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>
>---------------------------------------------------------------------
>To unsubscribe, e-mail: [EMAIL PROTECTED]
>For additional commands, e-mail: [EMAIL PROTECTED]
>
>





--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]

--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]






---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Reply via email to