2009-10-30 2 views
0

je le code suivant:OracleCommand blocs d'exécution si a OracleDependency

OracleConnection conn = new OracleConnection(connString); 
OracleCommand command = new OracleCommand("select * from testtable", conn); 
conn.Open(); 
OracleDependency.Port = 2010; 
OracleDependency dependency = new OracleDependency(command); 
command.AddRowid = true; 
command.Notification.IsNotifiedOnce = false; 

dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); 

command.CommandTimeout = 1000; 
DataTable t = new DataTable(); 
OracleDataAdapter adapter = new OracleDataAdapter(command); 
adapter.Fill(t); 
conn.Close(); 

Ceci est un code très simple qui utilise le service de notification Oracle pour recevoir des notifications concernant les changements de table particuliers.

Mon problème est que lorsque j'appelle adapter.Fill(t); l'exécution bloque simplement. La commande s'exécute dans une instance s'il n'y a pas de dépendance attachée à celle-ci, donc ce n'est pas la base de données ou les données. Je peux voir l'appel sur l'enregistrement de la base de données en interrogeant la table user_change_notification_regs et ont également ouvert le port spécifié (2010):

net8://(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST='myIp')(PORT=2010)))?PR=0 

Je suis à bout et esprit rand de choses à essayer.

Répondre

0

J'ai vu une exception soulevée dans une situation similaire lorsque j'ai essayé de définir le numéro de port sur un port déjà utilisé sur ma machine. Dès que j'ai commenté la configuration du numéro de port, ça s'est bien passé, alors peut-être que vous pourriez essayer ça? Et vérifiez "netstat -na" pour les ports utilisés.

L'exception que j'ai vu était:

Oracle.DataAccess.Client.OracleException: ORA-24912: Listener thread failed. Listen failed. 
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck) 
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, Boolean bCheck) 
at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
at Oracle.DataAccess.Client.OracleDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 
at System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 

La chose déroutante (au moins pour moi) était l'exception est soulevée pas quand le port est défini, mais plus tard, lorsque la première requête a été exécutée contre elle.