ORA-12519, TNS:il n'y a pas de service de gestionnaire d'trouvé lors de l'insertion dans la Base de données Oracle avec X threads
Je suis en train de les insérer dans la base de données Oracle qui a deux colonnes-
ID Primary Key varchar2 (4000)
ACCOUNT varchar2 (4000)
J'ai écrit un programme Multithread. Et chaque thread à l'aide de unique id
à chaque fois à insérer dans ID column
comme ID
est la clé primaire.
Le seul problème que je suis confronté à un certain point - Le code ci-dessous, les lancers, les exceptions ci-après au bout de quelques secondes.
1) Null Pointer Exception
2) java.sql.SQLException: Listener refused the connection with the following error:ORA-12519, TNS:no appropriate service handler found
Je ne suis pas en mesure de trouver l'origine de ce problème dans mon code car tout est bon à la recherche pour moi. Comme je suis à la clôture de chaque connexion correctement. Alors comment cette NPE est projeté et autre exception?
ExecutorService service = Executors.newFixedThreadPool(10);
try {
//queue some tasks
for (int i = 0; i < 100 * 10; i++) {
service.submit(new ThreadTask());
}
service.shutdown();
service.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
while (!service.isTerminated()) {
}
} catch (InterruptedException e) {
LOG.warn("Threw a Interrupted Exception in" + XMPLoadTest.class.getSimpleName()
+ ".XMPLoadTest: boss told me to stop...Not my fault!!");
}
Ci-dessous est ThreadTask classe-
class ThreadTask implements Runnable {
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String CONNECTION = "jdbc:oracle:thin:@localhost:1521:ORCL";
private static final String USER = "scott";
private static final String PASSWORD = "tiger";
private static Connection dbConnection = null;
private static PreparedStatement preparedStatement = null;
private static final AtomicInteger id = new AtomicInteger(1);
private final static Logger LOG = Logger.getLogger(ThreadTask.class.getName());
public ThreadTask() {
}
@Override
public void run() {
try {
dbConnection = getDBConnection();
preparedStatement = dbConnection.prepareStatement(Constants.INSERT_ORACLE_SQL);
preparedStatement.setString(1, String.valueOf(id.getAndIncrement()));
preparedStatement.setString(2, Constants.A_ACCOUNT);
preparedStatement.executeUpdate();
} catch (Exception e) {
//NPE getting thrown here/And second exception as well
LOG.error("Threw a SQLException in " + getClass().getSimpleName(), e);
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close();
preparedStatement = null;
} catch (SQLException e) {
//Oouch...
LOG.error("Threw a SQLException in finally block of prepared statement " + getClass().getSimpleName(), e);
}
}
if (dbConnection != null) {
try {
dbConnection.close();
dbConnection = null;
} catch (SQLException e) {
//Better go and look for SQL.
LOG.error("Threw a SQLException in finally block of dbConnection " + getClass().getSimpleName(), e);
}
}
}
}
/**
* Attempts to establish a connection to the given database URL
*
* @return the db connection
*/
private Connection getDBConnection() {
Connection dbConnection = null;
try {
Class.forName(XMP_DRIVER);
dbConnection = DriverManager.getConnection(CONNECTION, USER, PASSWORD);
} catch (ClassNotFoundException e) {
LOG.error("Threw a ClassNotFoundException in " + getClass().getSimpleName(), e);
} catch (SQLException e) {
//DAMN! I'm not....
LOG.error("Threw a SQLException in " + getClass().getSimpleName(), e);
} catch (Exception e) {
LOG.error("Threw a Exception in " + getClass().getSimpleName(), e);
}
return dbConnection;
}
}
Est-il un potentiel problème avec mon code? Je suis plus inquiet au sujet de cette NPE.
StackTrace:
19:14:28,372 ERROR ThreadTask:187 - Threw a SQLException in ThreadTask
java.sql.SQLException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:458)
at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
at java.sql.DriverManager.getConnection(DriverManager.java:322)
at java.sql.DriverManager.getConnection(DriverManager.java:358)
at com.ebay.xmp.lnp.ThreadTask.getDBConnection(XMPLoadTest.java:179)
at com.ebay.xmp.lnp.ThreadTask.run(XMPLoadTest.java:137)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
at java.util.concurrent.FutureTask.run(FutureTask.java:149)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
Caused by: oracle.net.ns.NetException: Listener refused the connection with the following error:
ORA-12519, TNS:no appropriate service handler found
at oracle.net.ns.NSProtocol.connect(NSProtocol.java:395)
at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1102)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:320)
... 14 more
19:14:28,376 ERROR ThreadTask:139 - Threw a SQLException in ThreadTask
java.lang.NullPointerException
at com.ebay.xmp.lnp.ThreadTask.run(XMPLoadTest.java:137)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:452)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:314)
at java.util.concurrent.FutureTask.run(FutureTask.java:149)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:897)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:919)
at java.lang.Thread.run(Thread.java:736)
Grâce Prateek pour l'aider. J'ai oublié de la version Oracle mais je suppose qu'il est
11g or 10g
une idée sur ma première exception qui est Null Pointer Exception
? À ce stade, qui peut se présenter? En attendant, je vais jeter un oeil sur l'article que vous m'avez fourni.Vous n'avez pas donné de ligne exacte où cette erreur se produit, mais le plus probable, c'est en raison de nulle dbConnection retourné à partir de getDBConnection méthode.
Veuillez mettre à jour votre réponse avec la trace de la pile de l'exception de pointeur null. Une chose que je pourrais croire qu'elle est la variable
dbConnection
se null dans une condition de concurrence et un autre thread tente d'exécuter une preparedStatement.executeUpdate()
sur elle.J'ai mis à jour ma question avec Stacktrace. Je crois aussi que ça se passe parce que
dbConnection null
seul et je suis étonné comment dbConnection est nulle? Il pourrait être une condition de course. Je n'ai debug qui et de comprendre dbConnection était retourner null. Mais comment est-ce possible? Et comment on peut résoudre ce problème?
OriginalL'auteur AKIWEB | 2013-02-06
Vous devez vous connecter pour publier un commentaire.
La condition de la course est l'explication la plus simple parce que le code actuel, il ya une garantie pour la
dbConnection
existe en tant que valeur non nulle lorsque plusieurs threads en cours d'exécution.Pour le dire simplement, chaque
ThreadTask
objet a accès à lastatic Connection dbConnection
champ de la classe. Si pour l'évaluation nous, il y a 3 fils a commencé pendant les applications de l'initiation, et le suivant se produit:Au temps (T), puisque la variable statique est définie à
null
par leThread1
, votreThread3
va jeter l'exception.* Mise à jour *
Vous avez besoin de faire usage de la connexion de mise en commun, découvrez c3p0
* Mise À Jour De Fin *
private Connection dbConnection = null; private PreparedStatement preparedStatement = null;
Droit? Au lieu d'utiliserstatic connection and statement
?Mise à jour de ma réponse, pour obtenir des éclaircissements.
Grâce Vijay pour la mise à jour. En dehors de la connexion de regroupement. Il devrait y avoir une autre façon d'éviter cette condition de Course aussi bien à droite?
Java n'est pas mon jour pour jour, le travail de la langue, mais je suppose que
ThreadLocal
devrait fournir une option pour vous, si vous n'êtes pas à la recherche dans c3p0. Découvrez surThreadLocal
ibm.com/developerworks/java/library/j-threads3/index.htmlCette mise à jour, même quand il résout le problème, n'est pas en expliquant pourquoi.
OriginalL'auteur
Je viens de rencontré le Même Scénario.
Ma Condition Scénario :
Je travaillais dans Eclipse IDE sur un Simple Hibernate programme contenant une opération d'insertion.
Cette Exception permet de se produire à certaines entrées pendant l'INSERTION par l'intermédiaire de mon HIBERNATION programme & ne pas se produire à certains autres intrants.
yup, sa semble stupide et bizarre.
J'étais confus, je ne regarde plus de réponses sur google n pile de flux etc.
C'était une observation très simple qui m'a sauvé la Journée entière!
Si u ont à travailler dans eclipse & si u rencontre de ces même genre de scénario...
Solution :
Dans Eclipse, j'ai simplement Fermé toutes les ouvert les consoles dans la "Console" de l'onglet qui s'est développé lorsque j'ai exécuté d même programme plusieurs fois. Ils ont obtenu empilés & comme prévu, il a manqué d'espace. La fermeture de tous les d'eux a résolu mon problème.
Cela ne sonne comme un très vague de la solution.
Jamais son esprit était observation pour expliquer pourquoi c'est arrivé et l'exception ne se reproduise pas.
L'IDE Eclipse Image
OriginalL'auteur Aniket