2009-12-21 2 views
0

J'essaie d'exécuter un exemple de programme pour les fragments d'hibernation. Je suis tout fait avec elle, mais chaque fois que je lance le programme de test, je reçois une exceptionProblème avec Hibernate Shards & JNDI

javax.naming.NoInitialContextException: Need to specify class name in environment or system property

Après googler je suis arrivé à savoir que j'ai pour définir les propriétés JNDI. .. Je l'ai fait comme ce

Hashtable env = new Hashtable(); 
env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.enterprise.naming.SerialInitContextFactory"); 
env.put(Context.PROVIDER_URL, "<some-IP>:3306"); 
Context initialContext = new InitialContext(env); 

javax.naming.NoInitialContextException: Cannot instantiate class: com.sun.enterprise.naming.SerialInitContextFactory [Root exception is java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory] 
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:657) 
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
at javax.naming.InitialContext.init(InitialContext.java:223) 
at javax.naming.InitialContext.<init>(InitialContext.java:197) 
at com.hibshards.test.JNDIProperties.setProperties(JNDIProperties.java:18) 
at com.hibshards.test.SessionFactoryImpl.createSessionFactory(SessionFactoryImpl.java:32) 
at com.hibshards.test.ShardTest.main(ShardTest.java:17) 
Caused by: java.lang.ClassNotFoundException: com.sun.enterprise.naming.SerialInitContextFactory 
at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
at java.lang.Class.forName0(Native Method) 
at java.lang.Class.forName(Class.java:247) 
at com.sun.naming.internal.VersionHelper12.loadClass(VersionHelper12.java:46) 
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:654) 
... 6 more 

Mais encore les choses ne fonctionnent pas :-( S'il vous plaît aider Que n où je suis manque

Voici le code:

public class SessionFactoryImpl { 

    private static final String SHARD_CFG_0 = "/com/hibshards/config/shard0.hibernate.cfg.xml"; 
    private static final String SHARD_CFG_1 = "/com/hibshards/config/shard1.hibernate.cfg.xml"; 
    private static final String SHARDED_TABLE = "com/hibshards/orm/weather.hbm.xml"; 

    public static SessionFactory createSessionFactory() throws NamingException { 
     Configuration prototypeConfig = new Configuration().configure(SHARD_CFG_0); 
     prototypeConfig.addResource(SHARDED_TABLE); 

     List<ShardConfiguration> shardConfigs = new ArrayList<ShardConfiguration>(); 
     shardConfigs.add(buildShardConfig(SHARD_CFG_0)); 
     shardConfigs.add(buildShardConfig(SHARD_CFG_1)); 

     ShardStrategyFactory shardStrategyFactory = buildShardStrategyFactory(); 
     ShardedConfiguration shardedConfig = new ShardedConfiguration(
       prototypeConfig, 
       shardConfigs, 
       shardStrategyFactory); 
     return shardedConfig.buildShardedSessionFactory(); 
    } 

    private static ShardStrategyFactory buildShardStrategyFactory() { 

     ShardStrategyFactory shardStrategyFactory = new ShardStrategyFactory() { 
      public ShardStrategy newShardStrategy(List<ShardId> shardIds) { 
       RoundRobinShardLoadBalancer loadBalancer = new RoundRobinShardLoadBalancer(shardIds); 
       ShardSelectionStrategy pss = new RoundRobinShardSelectionStrategy(loadBalancer); 
       ShardResolutionStrategy prs = new AllShardsShardResolutionStrategy(shardIds); 
       ShardAccessStrategy pas = new SequentialShardAccessStrategy(); 
       return new ShardStrategyImpl(pss, prs, pas); 
      } 
     }; 
     return shardStrategyFactory; 
    } 

    private static ShardConfiguration buildShardConfig(String configFile) { 
     Configuration config = new Configuration().configure(configFile); 
     return new ConfigurationToShardConfigurationAdapter(config); 
    } 
} 

<?xml version='1.0' encoding='utf-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
"-//Hibernate/Hibernate Configuration DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 

    <hibernate-configuration> 
    <session-factory name="HibernateSessionFactory0"> 
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> 
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="connection.url">jdbc:mysql://localhost:3306/shardDB</property> 
    <property name="connection.username">root</property> 
    <property name="connection.password">root</property> 
    <property name="hibernate.connection.shard_id">0</property> 
    <property name="hibernate.shard.enable_cross_shard_relationship_checks">true</property> 
    </session-factory> 
    </hibernate-configuration> 


public class JNDIProperties { 
public static void setProperties() throws NamingException { 
    Properties properties = new Properties(); 
    properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory"); 
    properties.put(Context.PROVIDER_URL, "file:///"); 
    Context initialContext = new InitialContext(properties); 
    } 
      } 
+0

Il est très peu probable que l'environnement JDNI est correctement configuré (le provi der URL semble utiliser un port mysql qui est très étrange). Veuillez fournir plus de détails sur ce que fait votre code. Qu'essayes-tu de chercher? Quel serveur d'applications utilisez-vous? Veuillez également ajouter la trace de la pile complète. –

+0

J'essaye de créer un environnement de sharding. Genre d'application de démonstration. N'utilise aucun serveur. Ma base de données réside sur deux machines différentes, donc, j'ai passé l'adresse IP de cette machine. javax.naming.NoInitialContextException: nécessité de spécifier le nom de la classe dans l'environnement ou la propriété système, ou en tant que paramètre d'applet, ou dans un fichier de ressources d'application: java.naming.factory.initial \t at javax.naming.spi.NamingManager.getInitialContext (NamingManager.java:645) at javax.naming.InitialContext.getDefaultInitCtx (InitialContext.java:288) – Rites

+0

S'il vous plaît modifier votre question pour ajouter le ** full ** stacktrace. –

Répondre

2

En une application java simple, vous n'avez pas besoin de nom pour l'usine de session .. .try supprimer le nom dans votre fichier cfg.xml et l'exécuter