sql >> データベース >  >> NoSQL >> MongoDB

jndi経由のMongoDb

    はい、可能です。独自のJNDIファクトリを作成できるのに、なぜ他のコードに依存するのでしょうか。javax.naming.spi.ObjectFactoryを実装するクラスと、JNDIコンテキストからmongoをプルするBeanを作成するだけで、これをSpringデータ用に構成しました。 -mongoMongoTemplateオブジェクト。

    public class CustomMongoJNDIFactory implements ObjectFactory {
    
    public Object getObjectInstance(Object obj, Name name, Context nameCtx,
            Hashtable<?, ?> environment) throws Exception {
    
        validateProperty(obj, "Invalid JNDI object reference");
    
        MongoTemplate mongoTemplate = null;
        String db = null;
        String host = null;
        String username = null;
        String password = null;
        int port = 27017;
    
        Reference ref = (Reference) obj;
        Enumeration<RefAddr> props = ref.getAll();
        while (props.hasMoreElements()) {
            RefAddr addr = (RefAddr) props.nextElement();
            String propName = addr.getType();
            String propValue = (String) addr.getContent();
            if (propName.equals("db")) {
                db = propValue;
            } else if (propName.equals("host")) {
                host = propValue;
            } else if (propName.equals("username")) {
                username = propValue;
            } else if (propName.equals("password")) {
                password = propValue;
            } else if (name.equals("port")) {
                try {
                    port = Integer.parseInt(propValue);
                } catch (NumberFormatException e) {
                    throw new NamingException("Invalid port value " + propValue);
                }
            }
    
        }
    
        // validate properties
        validateProperty(db, "Invalid or empty mongo database name");
        validateProperty(host, "Invalid or empty mongo host");
        validateProperty(username, "Invalid or empty mongo username");
        validateProperty(password, "Invalid or empty mongo password");
    
        //create mongo template
        mongoTemplate = new MongoTemplate(new Mongo(host, port), db,
                new UserCredentials(username, password));
    
        return mongoTemplate;
    }
    
    
    /**
     * Validate internal String properties
     * 
     * @param property
     * @param errorMessage
     * @throws NamingException
     */
    private void validateProperty(String property, String errorMessage)
            throws NamingException {
        if (property == null || property.trim().equals("")) {
            throw new NamingException(errorMessage);
        }
    }
    
    /**
     * Validate internal Object properties
     * 
     * @param property
     * @param errorMessage
     * @throws NamingException
     */
    private void validateProperty(Object property, String errorMessage)
            throws NamingException {
        if (property == null) {
            throw new NamingException(errorMessage);
        }
    }
    

    }

    春の豆:

    @Configuration
    @Qualifier("mongoTemplate")
    public class CustomMongoTemplate  {
    
    
     public @Bean MongoTemplate mongoTemplate() throws Exception {
         Context initCtx = new InitialContext();
         Context envCtx = (Context) initCtx.lookup("java:comp/env");
         return (MongoTemplate) envCtx.lookup("bean/MyMongoBean");
        }
    }
    

    Context.xml:

    <Resource name="bean/MyMongoBean" auth="Container"
            type="org.springframework.data.mongodb.core.MongoTemplate"
            factory="com.package.CustomMongoJNDIFactory"
            host="" db="" username="" password=""/>
    

    Web.xml

        <resource-env-ref>
        <description>Mongo JNDI configuration</description>
        <resource-env-ref-name>comp/env/bean/MyMongoBean</resource-env-ref-name>
        <resource-env-ref-type>org.springframework.data.mongodb.core.MongoTemplate</resource-env-ref-type>
    </resource-env-ref>
    


    1. フラスコ:バックグラウンドワーカーのジョブを渡す(rq、redis)

    2. AzureRedisCacheの最大接続数に達しました

    3. Redis Clusterを使用すると、ハッシュタグをevalに渡すだけで済みますか?

    4. JSONにシリアル化してRails4.0.3に戻すときに、has_many:throughの関係を維持するにはどうすればよいですか?