Use same transaction in entity-bean and Datasource
Hello
I've got following problem. In my stateless container managed transaction Sessionbean i do some inserts and update on my container managed entity bean. In the same transaction I have to read some informations on the database. Some of those informations are already set by the entity bean, but not yet commited. Now I want to read them through a javax.sql.DataSource. But this Datasource doesn't use the same transaction as the session bean.
Question: Is it possible to let a Datasoucre use the same Transaction as Sessionbean?
(i work with WSAD 4.0.3)
Thanks
Hi,
You would have to check that you are using an XADataSource instance, instead of a 'regular' DataSource instance (which will not adopt the transaction started by the application server). In particular, the JNDI lookup name of the DataSource should actually point to an instance of XADataSource; a special type for container transactions.
The administration/deployment tools of the WS will allow you to do that, under Resource Factories or DataSources somewhere.
Both types look the same towards your application code, so your session bean is probably fine the way it is and does not need rewriting. It is merely in the setup of the WS server that the difference lies.
Best,
Guy
http://www.atomikos.com
Similar Messages
-
How to use same transaction when calling CMP entity beans and DAO (JDBC)
We are currently using Weblogic 8.1 SP2 with an Oracle 10g database (using XA thin and non-XA drivers).
We have a session bean that invokes an entity bean and a DAO (data access object pattern) in order to add data in 2 separate tables (account and history). Rows are added to the first (account) table using a CMP Entity bean while inserts are done in the 2nd (history) table using a DAO. Here is some pseudo code:
addHistorySessionBean (trans-attribute="Required")
begin
Step #1 - call addAccountEntityBean (trans- attribute="Required")
Step #2 - call addHistoryDAO (get datasource, connection)
end
The 2nd table (history) has a foreign key constraint to ensure that the corresponding key exists in the first (account) table. Unfortunately, DAO inserts on the 2nd (history) table fail with a foreign key constraint violation (INTEGRITY CONSTRAINT VIOLATION - PARENT KEY NOT FOUND!) since they cannot see the row added to the 1st (account) table in step #1 by the CMP entity bean.
How does one ensure that all this is done in a single transaction ? It appears that the app server creates two seperate transactions (one for the session bean facade and the entity bean and a 2nd transaction (when we retrieve a connection using the same data source JNDI name) for the DAO.
A post on server side suggested using a "<resource-ref>" in the session bean to tie the two potentially separate transactions together, but that does not work for us. However, I am not sure if we are doing that correctly. After we define the resource ref in the session facade bean, do we use the resource ref "name" attribute to lookup the datasource or do we still lookup the datasource by JNDI name ? Do we need to define the resource-ref tag in the entity bean also ?
Does Weblogic allow using a single transaction for this type of a scenario ? How does one specify within Weblogic that the same transaction should be utilized by the entity bean and any subsequent DAOs?
People have also suggested that we defer constraint checking until the transaction(s) are committed but that sounds like a work acount without addressing this issue. Would postponing the constraint checking in Oracle cause any additional overhead ?
Any suggestions with specific examples or documentation on how to address this issue will be gratefully appreciated.Thanks for your suggestion. Unfortunately, this does not work since it appears that there are 2 separate transactions going on here. One, the original one initiated by the session bean and used by the entity bean and the other initiated by the DAO. Any other ideas appreciated.
Hi,
Try setting the delay-database-inserts tag to
ejbCreate in RDBMS descriptor file.
http://bernal/stage/wls/docs81/ejb/DDreference-cmp-jar
.html#1113981
vasanthi ramesh -
Need a Tx aware datasource when using CMT with BMP entity beans?
When using Containter-Managed Transactions with entity beans that have
bean-managed persistence, do I need to use a transaction-aware datasource?
Thanks,
Ken Gertsen
Hi ad13217 and thanks for reply.
I'm sorry but my code is like this:
javax.naming.Context ctx=new javax.naming.InitialContext();
arguments was an error on copy, but it doesn't work.
Thanks
Fil -
Can we use same Business Service for Sender and Receiver
Can we use same Business Service for Sender and Receiver
Hi
In addition to the above infomation explaining about the Business Service..
Business Service: Address an abstract business entity as the sender or receiver of messages.
Using a business service, you can define the technical or business subunits of the companies involved and then assign them the relevant interfaces.
The business services are used when configuring cross-company processes also..
regards
Kishore -
Do we use same bank accounts in APP and BRS
do we use same bank accounts in APP and BRS
Hi pragnesh,
It is basic criteria, u need to maintain same bank accounts for APP and BRS, after all what is APP, you are paying amount from your bank account for which the Bank will send the statement for your accont mentioning the various transactions. There is a link between APP and BRS, what ever house bank u r created in FI12, the same needs to be assigned in FBZP (APP configuration) under bank determination.
Hope u understood.
regards
srikanth -
Entity Beans and Session beans to represet Business lOgic
How cam we implement Entity Beans and Session beans to represent Business Logic.
Can anyone explain how can we do this.
Regards...I have session beans calling method in entity beans and any client
doesn't have access to entity beans, only via session beans.
If i define security policy and method permissions for session beans
only, do entity beans use that permissions when calling their methods
from sessions beans OR should i define the security policy for entity
beans separately?If you want to set the permission on individual
methods of entity bean ( with different roles)
you have to do it separately.
If you want to delegate the Authenticated user along with
the method call to the Entity Bean you can use
run-as-identity-principal.
For more detail please check out the EJB2.0 Spec.
-utpal -
i have two iphone one is iphone 5 and othere is iphone 4 . can i use same id for both ? And do i have to purchase the application again for iphone 4 which i have buyed for iphone 5.??
You can use the same Apple ID for both phones, you would then be able to use the purchased Apps/Content on both phones without having to pay again.
-
No. of users using same transaction
hai iam shivaa.
how can we find no. of users using same transaction at a given time on a given server.can i also know the order(time) in which the users started using the transaction?
eg--no. of users using transation VA01 on a given server at a given time.
--order in which users started using VAO1Hi Shiva,
If you have got the appropriate solution, reward all useful answers & close the thread.
Regards,
Senthilkumar SD -
How can I control the EJB's Transaction with entity bean
If I use entity bean, the Transaction is managed by container.and I want to create JDBC Connection by myselft ,not the Datasource,how is the transaction is controlled by the container,if transaction is not controlled ,how can I control it??
Hi,
If you want to control the transaction your self then you need to use javax.transaction.UserTransaction interface and methods defined by it.
Hope this helps
Vishal -
Hi,
My environment is:
- Weblogic 5.1 running on Solaris
- Oracle 8i database server
- Two physical servers clustered together to form one logical server
I can possibly upgrade to Weblogic 6 or later if it'll help solve my
problem.
Here's what I'm trying to accomplish:
I want to write entity beans using bean-managed persistence. The BMP
part of it is strongly preferred because our DBAs like to see and tune
all of the queries we send from the application.
In many cases, the data I'm querying is largely static. I want to
write EJBs that will cache the data in memory and avoid reading it
from the database server every time the EJB is invoked, unless it
knows that the data has changed.
I've done this successfully with single-server installations, but I'm
not sure how it'll work with a clustered server. Assuming nothing
outside of my two Weblogic servers is updating my database, can I
configure the EJB to have exclusive access to the database and count
on Weblogic to manage the state between the two servers? Or do I have
to implement some kind of custom signalling scheme so that an EJB in
one container can notify any EJBs in the other container with the same
primary key when it has updated the underlying data?
I know from experience that the container will call the ejbStore()
method whenever a transaction ends. My usual BMP pattern in the past
has been to keep track of whether any data has changed during the
transaction and update only those database columns, if any, that
actually changed. But I don't think the store method has any way of
notifying the container as to whether or not it actually stored
anything; hence, I can't see how the container would know when to
order the entity bean on the opposite server to reload itself.
Thanks.The 6.1 implements functionality you want:
http://e-docs.bea.com/wls/docs61/ejb/EJB_environment.html#1121105
if you use 5.1 you can use this approach:
http://dima.dhs.org/misc/readOnlyUpdates.html
Frank LaRosa <[email protected]> wrote:
Hi,
My environment is:
- Weblogic 5.1 running on Solaris
- Oracle 8i database server
- Two physical servers clustered together to form one logical server
I can possibly upgrade to Weblogic 6 or later if it'll help solve my
problem.
Here's what I'm trying to accomplish:
I want to write entity beans using bean-managed persistence. The BMP
part of it is strongly preferred because our DBAs like to see and tune
all of the queries we send from the application.
In many cases, the data I'm querying is largely static. I want to
write EJBs that will cache the data in memory and avoid reading it
from the database server every time the EJB is invoked, unless it
knows that the data has changed.
I've done this successfully with single-server installations, but I'm
not sure how it'll work with a clustered server. Assuming nothing
outside of my two Weblogic servers is updating my database, can I
configure the EJB to have exclusive access to the database and count
on Weblogic to manage the state between the two servers? Or do I have
to implement some kind of custom signalling scheme so that an EJB in
one container can notify any EJBs in the other container with the same
primary key when it has updated the underlying data?
I know from experience that the container will call the ejbStore()
method whenever a transaction ends. My usual BMP pattern in the past
has been to keep track of whether any data has changed during the
transaction and update only those database columns, if any, that
actually changed. But I don't think the store method has any way of
notifying the container as to whether or not it actually stored
anything; hence, I can't see how the container would know when to
order the entity bean on the opposite server to reload itself.
Thanks.--
Dimitri -
EJB 3.0 entity beans and WebDynpro models
Hi all,
first off all my setup:
WebDynpro Development Component: dcA
EJB Module Development Component: dcB
i wan't to create Entity Beans in dcB an use it for my model in dcA.
My questions:
1. Why does the "New Wizard" only offer EJB 3.0 Session and Message Beans an no Entity Beans? What is the correct way for creating Entity Beans in DevStudio?
2. Is ist right that i have to define a public Part containing the Entity Bean to make it visible to dcA?
Regards,
ChristianHi,
I'm experiencing same problems, is this a bug or an feature? -
I have looked at BC4J and it looks good. Buy my question is that isn't this frame work in direct conflict with EJB entity beans. I know lot of stuff that is there in BC4J should have been in EJB enitiy beans, but as a developer why should I go with BC4J and not the standard EJB stuff considering the fact that BC4J is properietery to Oracle?Any thoughts?
Vimal,
Without going into exhaustive detail here, I would like to recommend that you take a look at the BC4J Technical White Paper available from the JDeveloper page on OTN (in the 3.0 Technical Information section):
http://technet.oracle.com/products/jdev/info/techwp20/wp.html
Amoung other things to note, BC4J is based on pure Java, and is what we consider a 'white box', meaning, you as a developer have complete control over what is going on. You can extend any of the code generated to customize it.
Primarily though, the major benefit of BC4J is that we have taken care of most of the complicated communication code for you. Communication between the client and the data server, transaction handling, row locking, etc are already written for you. You just use, extend, customize what we have provided.
In addition, BC4J allows you flexibility in your deployment environment decision. Regardless of where and how you deploy your BC4J Application Module, the client is unchanged.
Those are the key advantages. Again, for more details, I would take a look at the white paper to see if it more fully addresses your questions. -
Using Composite keys in Entity Beans
Hi, I am trying to develop a test application with two entity beans, (1) OrderBean (key is a string called order_no) and (2) LineBean (key is order_no and an integer line_no) using CMP 2.0. Relationship between OrderBean to LineBean is 1 to many. I created a primary key class for LineBean called, LinePK with both order_no and line_no as the public members. My home interface for LineBean has the following three finder methods:
public java.lang.Object findByPrimaryKey(LinePK lkey);
public Collection findByOrder(String order_no);
public Collection findByProduct(String product_id);
I could provide sql for the OrderBean which has only one field(order_no) as primary key, but I don't know how to code appropriate SQL for the finder methods of LineBean involving a user defined primary key class (in my case LinePK with order_no and line_no). I am trying to deploy this application in J2EE RI server, but getting deployment errors saying invalid return types for the finder methods. In the deploytool I provided the primary key class for LineBean as java.lang.Object with no primary key field name. Any help in this matter with sample sql code is greatly appreciated. Thanks !!!Some things to consider:
- Your findByPrimaryKey in the Remote interface needs to have the remote interface as return type
- The implementation of the finder needs to have your primary key class as return type
- If you're using CMP 2.0, you need to specify the search criteria as EJB QL
Using CMP 2.0, you don't code findByPrimaryKey at all, all you need is the EJB QL for findByOrder/findByProduct in the deployment descriptor. The EJB QL for findByOrder would look like:
select Object o from Line where o.order_no = ?1If you use BMP, you would code the findByPrimaryKey implementation like this:
public LinePK ejbFindByPrimaryKey(LinePK pk) throws FinderException {
String sql = "select order_no from line_table where line_no=? and order_no=?";
InitialContext ic = new InitialContext();
Object obj = ic.lookup("datasourcename");
DataSource ds = (DataSource)PortableRemoteObject.narrow(obj, DataSource.class);
Connection conn = ds.getConnection();
try {
PreparedStatement stmt = conn.prepareStatement(sql);
try {
stmt.setInteger(1, pk.line_no);
stmt.setInteger(2, pk.order_no);
ResultSet rs = stmt.executeQuery();
if (!rs.next())
throw new ObjectNotFoundException("not found: " + order_no + "." + line_no);
return pk;
finally {
stmt.close();
finally {
conn.close(); -
Strange behavior with entity beans and servlets in a cluster
We have 2 WebLogic 4.5.1 servers in a cluster with none of the Service
Packs installed. When a client uses the deployed entity beans or
servlets they work every other time. The times they do not work nothing
happens. No exceptions, no responses to the client ( i.e. HTTP 404s ),
nothing. I suspect something in the cluster setup since we do not have
these same problems on non-clustered entity beans or servlets. We have
made sure all the entity beans have the Shared Database flag set on and
added the delayUpdatesUntilEndOfTx false to the enviroment of the DD.
That didn't fix the problem. Any ideas?
Thanks in advance,
Dallas Dempsey
DEM - Houston, TX
Do you have log files?
- Prasad
Chris Dempsey wrote:
> We have 2 WebLogic 4.5.1 servers in a cluster with none of the Service
> Packs installed. When a client uses the deployed entity beans or
> servlets they work every other time. The times they do not work nothing
> happens. No exceptions, no responses to the client ( i.e. HTTP 404s ),
> nothing. I suspect something in the cluster setup since we do not have
> these same problems on non-clustered entity beans or servlets. We have
> made sure all the entity beans have the Shared Database flag set on and
> added the delayUpdatesUntilEndOfTx false to the enviroment of the DD.
> That didn't fix the problem. Any ideas?
>
> Thanks in advance,
> Dallas Dempsey
> DEM - Houston, TX
-
Problem with transaction with Entity Beans in R2
I had a transaction (initiated by a session bean (requires new)) that takes two entity beans (two bank accounts) and trasfer funds from one to another. It looks like the container is waiting for the transaction, i don't know, here comes the exception I get (this code used to work with a lot of simultaneous clients with R1) :
com.evermind.server.ejb.TimeoutExpiredException: timeout expired waiting for an instance
at com.evermind.server.ejb.DBEntityWrapperPool.getWrapperInstance(DBEntityWrapperPool.java:189)
at com.evermind.server.ejb.DBEntityEJBHome.getWrapperInstance(DBEntityEJBHome.java:135)
error: Remote: Database error, IO failure: com.evermind.server.rmi.OrionRemoteException: Error enlisting connection resource: javax.transaction.RollbackException: The transaction has been marked for rollback (timed out); nested exception is:
javax.transaction.RollbackException: The transaction has been marked for rollback (timed out); nested exception is:
com.evermind.server.rmi.OrionRemoteException: Error enlisting connection resource: javax.transaction.RollbackException: The transaction has been marked for rollback (timed out); nested exception is:
javax.transaction.RollbackException: The transaction has been marked for rollback (timed out)
above goes the ejb-jar.xml
<?xml version="1.0"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.2//EN" "http://java.sun.com/j2ee/dtds/ejb-jar_1_2.dtd">
<ejb-jar>
<description>
</description>
<enterprise-beans>
<session>
<description>
</description>
<ejb-name>ContaFacadeEJB</ejb-name>
<home>contacorrente.ContaFacadeHome</home>
<remote>contacorrente.ContaFacade</remote>
<ejb-class>contacorrente.ContaFacadeBean</ejb-class>
<ejb-ref>
<ejb-ref-name>ContaCorrenteEJB</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>contacorrente.ContaCorrenteHome</home>
<remote>contacorrente.ContaCorrente</remote>
</ejb-ref>
</session>
<entity>
<description>
</description>
<ejb-name>ContaCorrenteEJB</ejb-name>
<home>contacorrente.ContaCorrenteHome</home>
<remote>contacorrente.ContaCorrente</remote>
<ejb-class>contacorrente.ContaCorrenteBean</ejb-class>
<primkey-class>java.lang.String</primkey-class>
<reentrant>True</reentrant>
<persistence-type>Container</persistence-type>
<cmp-field><field-name>id_conta</field-name></cmp-field>
<cmp-field><field-name>saldo</field-name></cmp-field>
<cmp-field><field-name>senha</field-name></cmp-field>
<primkey-field>id_conta</primkey-field>
</entity>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>ContaFacadeEJB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
<container-transaction>
<method>
<ejb-name>ContaCorrenteEJB</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Mandatory</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
and the code of the beans (just the method used)
Entity (account)
public void debita(double valor) throws ContaCorrenteException
double saldoOld=saldo;
saldo=saldo-valor;
if (saldo<0)
throw new ContaCorrenteException("Saldo insuficiente:"+saldoOld);
Session :
public void transfere(String idConta1, String idConta2, double valor, String senha) throws ContaCorrenteException
try
Context cx=new InitialContext();
Object homeObject=cx.lookup("java:comp/env/ContaCorrenteEJB");
ContaCorrenteHome home=(ContaCorrenteHome) PortableRemoteObject.narrow(homeObject,ContaCorrenteHome.class);
ContaCorrente c1=null;
ContaCorrente c2=null;
try
c1=home.findByPrimaryKey(idConta1);
c2=home.findByPrimaryKey(idConta2);
if (!c1.getSenha().equals(senha)) { throw new ContaCorrenteException("Senha incorreta");}
catch(FinderException e)
System.out.println("erro ao localizar conta :"+e.getMessage());
context.setRollbackOnly();
throw new ContaCorrenteException("Conta inexistente");
catch(java.rmi.RemoteException e)
System.out.println("erro Remote: "+e.getMessage());
context.setRollbackOnly();
throw new ContaCorrenteException("Erro ao conectar objeto remoto");
try
c1.debita(valor);
c2.credita(valor);
catch(ContaCorrenteException e)
context.setRollbackOnly();
throw new ContaCorrenteException(e.getMessage());
catch(java.rmi.RemoteException e)
throw new ContaCorrenteException("Erro de conexco");
catch (NamingException e)
System.out.println("erro de localizagco:"+e.getMessage());
throw new ContaCorrenteException("Erro de acesso remoto na localizacao da conta");
please, someone help me...
Thanks in advanceI forgot : when i try to shut the server down i get the message :
Shutting down...
Error serializing bean: Deadlock detected, timing out call after 15 seconds wait for transaction [Transaction d9:fa:4f:b6:ff:ff:ff:ff:4a:0:0:0:0:0:0:0:0:4b:0:ec:6d:ce:c0:16]
Error serializing bean: Deadlock detected, timing out call after 15 seconds wait for transaction [Transaction d9:fa:4f:b6:ff:ff:ff:ff:4c:0:0:0:0:0:0:0:0:4d:0:ec:6d:d2:d9:d2]
Error serializing bean: Deadlock detected, timing out call after 15 seconds wait for transaction [Transaction d9:fa:4f:b6:ff:ff:ff:ff:4e:0:0:0:0:0:0:0:0:4f:0:ec:6d:d4:21:a3]
and it doesn't shutdown.
Maybe you are looking for
-
Need Help Putting Together a rMBP so I Have Everything I Need...
Hello- I am having trouble getting the right kind of help from "Chat Now" on apple.com and calling in to get my questions/needs taken care of so that when I get the rMBP I will be sure I wil have what I need to go right online and teach the online co
-
I am installing Windows 7 and I get an error message: "Your disk could not be partitioned. An error ocurred while partitioning the disk". I was using a Windows & Home Premium OEM Software that I purchased from Microsoft. I was given to Windows 100GB
-
so i dropped a few thousand books onto my ipad -- i read a few deleted a few, and deleted ones i read etc...when I go into my itunes on my laptop i want to delete the books i don't want anymore -- in the section listing my ipad the books are unchecke
-
Why is my Photoshop CS4 not installing both 64 and 32 bit versions?
Hello, I'm running Windows Vista Ultimate 64 bit. I purchased and downloaded Photoshop CS4 Extended and it installed as a 64 bit program. Now I need a 32 bit version also (for some Nik plugins), but the installer didn't install the 32 bit version (it
-
JCo & qRFC / IDOC_INBOUND_IN_QUEUE Error
Hello everybody, I have a java based server application, transporting IDocs between MES + SAP ERP. Till now I used tRFC for transfering IDocs from SAP to my server application. at the moment I'm checking out, how to use qRFC with my application. I ch