2016-05-20 10 views
6

का उपयोग कर कीस्पेस, टेबल और गतिशील रूप से टेबल जेनरेट करें कैसंड्रा का उपयोग करके, मैं स्प्रिंग बूट एप्लिकेशन का उपयोग करके गतिशील रूप से कुंजीपटल और तालिकाओं को बनाना चाहता हूं। मैं जावा आधारित विन्यास का उपयोग कर रहा हूँ।स्प्रिंग डेटा कैसंड्रा

मेरे पास @Table के साथ एनोटेटेड एक इकाई है जिसका स्कीमा मैं शुरू होने से पहले बनाया जाना चाहता हूं क्योंकि इससे पहले से ज्ञात फ़ील्ड तय किए गए हैं।

हालांकि लॉग इन उपयोगकर्ता के आधार पर, मैं उन उपयोगकर्ताओं के लिए गतिशील रूप से अतिरिक्त तालिकाओं को बनाना चाहता हूं और उन तालिकाओं में प्रविष्टियों को सम्मिलित करने में सक्षम होना चाहता हूं।

क्या कोई मुझे कुछ संसाधनों के लिए मार्गदर्शन कर सकता है जो मैं इन मुद्दों को हल करने के तरीके के बारे में सही दिशा में उपयोग या मुझे इंगित कर सकता हूं। मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

9

अपने स्प्रिंग बूट आवेदन करने के लिए Spring Boot Starter Data Cassandra निर्भरता को जोड़ने के लिए है, तो जैसा होगा करने के लिए सबसे आसान काम ...

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-data-cassandra</artifactId> 
    <version>1.3.5.RELEASE</version> 
</dependency> 

इसके अलावा, इस स्प्रिंग डाटा कैसेंड्राdependency में जोड़ देगा आपका आवेदन।

साथ स्प्रिंग डाटा कैसेंड्रा, आप अपने आवेदन के Keyspace (रों) का उपयोग कर कॉन्फ़िगर कर सकते हैं CassandraClusterFactoryBean (या अधिक सटीक, उपवर्ग ... CassandraCqlClusterFactoryBean) setKeyspaceCreations(:Set) विधि को फोन करके।

KeyspaceActionSpecification कक्षा सुंदर आत्म-व्याख्यात्मक है। आप KeyspaceActionSpecificationFactoryBean के साथ भी एक बना सकते हैं, इसे Set पर जोड़ें और फिर CassandraClusterFactoryBean पर setKeyspaceCreations(..) विधि को पास करें।

आवेदन के टेबल्स पैदा करने के लिए, आप अनिवार्य रूप से सिर्फ अपने आवेदन डोमेन वस्तु (रों) (संस्थाओं) व्याख्या एसडी कैसेंड्रा @Table एनोटेशन का उपयोग कर, और सुनिश्चित करें कि आपके डोमेन वस्तुओं/संस्थाओं आवेदन के CLASSPATH पर पाया जा सकता बनाने की जरूरत है।

विशेष रूप से, आप अपना आवेदन @Configuration कक्षा एसडी कैसंड्रा AbstractClusterConfiguration कक्षा का विस्तार कर सकते हैं। वहां, आपको getEntityBasePackages():String[] विधि मिल जाएगी जो आप अपने एप्लिकेशन डोमेन ऑब्जेक्ट/इकाई कक्षाओं वाले पैकेज स्थानों को प्रदान करने के लिए ओवरराइड कर सकते हैं, जिसे एसडी कैसंड्रा scan पर @Table डोमेन ऑब्जेक्ट/इकाइयों के लिए उपयोग करेगा।

आपके आवेदन @Table डोमेन वस्तु के साथ/संस्थाओं को ठीक से पहचान की है, आप एसडी कैसेंड्रा SchemaActionCREATE करने के लिए CassandraSessionFactoryBean विधि, setSchemaAction(:SchemaAction) का उपयोग कर निर्धारित किया है। यह स्कैन के दौरान पाए गए सभी डोमेन ऑब्जेक्ट/इकाइयों के लिए आपके कीस्पेस में टेबल्स बनाएगा, जो आपको identified उचित CassandraSessionFactoryBean पर उपयुक्त कीस्पेस प्रदान करेगा।

जाहिर है, अगर आपके आवेदन बनाता है/एकाधिक Keyspaces का उपयोग करता है, तो आप, entityBasePackages विन्यास संपत्ति संस्थाओं है कि एक विशेष Keyspace से संबंध रखते हैं के लिए उचित रूप से सेट के साथ, ताकि उससे संबद्ध टेबल्स हैं प्रत्येक Keyspace के लिए एक अलग CassandraSessionFactoryBean बनाने की आवश्यकता होगी उस कुंजीस्पेस में बनाया गया।

अब ...

प्रति उपयोगकर्ता "अतिरिक्त" तालिका के लिए, कि काफ़ी अधिक जटिल और मुश्किल है।

आप यहां स्प्रिंग प्रोफाइल का लाभ उठाने में सक्षम हो सकते हैं, हालांकि, प्रोफाइल आमतौर पर स्टार्टअप पर ही लागू होते हैं। यदि कोई अलग उपयोगकर्ता पहले से चल रहे एप्लिकेशन में लॉग इन करता है, तो आपको रनटाइम पर ApplicationContext पर अतिरिक्त @Configuration कक्षाएं प्रदान करने का एक तरीका चाहिए।

आपका स्प्रिंग बूट आवेदन एक AnnotationConfigApplicationContext के लिए एक संदर्भ इंजेक्षन सकता है, और फिर लॉगिन ईवेंट पर इसका इस्तेमाल करने वाले उपयोगकर्ता आवेदन में लॉग इन के आधार पर प्रोग्राम के रूप में register अतिरिक्त @Configuration वर्गों के लिए। ApplicationContext.refresh() के साथ आपको अपने register(Class...) कॉल (ओं) का पालन करना होगा।

आपको उस स्थिति को उचित रूप से संभालने की आवश्यकता है जहां टेबल्स पहले से मौजूद हैं।

यह वर्तमान में एसडी कैसंद्रा में समर्थित नहीं है, लेकिन अधिक जानकारी के लिए DATACASS-219 देखें।

तकनीकी रूप से, रनटाइम पर सभी उपयोगकर्ताओं के लिए आवेदन द्वारा आवश्यक सभी संभावित टेबल्स बनाने और कैसंड्रा की सुरक्षा सेटिंग्स का उपयोग करने के लिए भूमिका और असाइन अनुमतियों द्वारा व्यक्तिगत उपयोगकर्ता पहुंच को प्रतिबंधित करने के लिए बहुत आसान होगा।

कोई अन्य विकल्प केवल अस्थायी कीस्पेस और/या टेबल्स बनाने के लिए हो सकता है जब उपयोगकर्ता एप्लिकेशन में लॉग इन करता है, उपयोगकर्ता को लॉग आउट करते समय उन्हें छोड़ दें।

स्पष्ट रूप से, यहां कई सारे विकल्प हैं, और यह वास्तुशिल्प निर्णयों, व्यापारिकताओं और विचारों के लिए और अधिक उबलता है, फिर यह तकनीकी व्यवहार्यता करता है, इसलिए सावधान रहें।

उम्मीद है कि इससे मदद मिलती है।

चीयर्स!

10

वसंत कॉन्फ़िगरेशन क्लास के बाद कुंजीपटल और तालिकाओं का निर्माण होता है यदि वे मौजूद नहीं हैं।

@Configuration 
public class CassandraConfig extends AbstractCassandraConfiguration { 
    private static final String KEYSPACE = "my_keyspace"; 
    private static final String USERNAME = "cassandra"; 
    private static final String PASSWORD = "cassandra"; 
    private static final String NODES = "127.0.0.1"; // comma seperated nodes 


    @Bean 
    @Override 
    public CassandraCqlClusterFactoryBean cluster() { 
     CassandraCqlClusterFactoryBean bean = new CassandraCqlClusterFactoryBean(); 
     bean.setKeyspaceCreations(getKeyspaceCreations()); 
     bean.setContactPoints(NODES); 
     bean.setUsername(USERNAME); 
     bean.setPassword(PASSWORD); 
     return bean; 
    } 

    @Override 
    public SchemaAction getSchemaAction() { 
     return SchemaAction.CREATE_IF_NOT_EXISTS; 
    } 

    @Override 
    protected String getKeyspaceName() { 
     return KEYSPACE; 
    } 

    @Override 
    public String[] getEntityBasePackages() { 
     return new String[]{"com.panda"}; 
    } 


    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() { 
     List<CreateKeyspaceSpecification> createKeyspaceSpecifications = new ArrayList<>(); 
     createKeyspaceSpecifications.add(getKeySpaceSpecification()); 
     return createKeyspaceSpecifications; 
    } 

    // Below method creates "my_keyspace" if it doesnt exist. 
    private CreateKeyspaceSpecification getKeySpaceSpecification() { 
     CreateKeyspaceSpecification pandaCoopKeyspace = new CreateKeyspaceSpecification(); 
     DataCenterReplication dcr = new DataCenterReplication("dc1", 3L); 
     pandaCoopKeyspace.name(KEYSPACE); 
     pandaCoopKeyspace.ifNotExists(true).createKeyspace().withNetworkReplication(dcr); 
     return pandaCoopKeyspace; 
    } 

} 
+0

मैं इस कोड का पालन किया है, लेकिन अभी भी मैं करने में असमर्थ हूँ एक keyspace पैदा करेगा एप्लिकेशन के बूट पर कीस्पेस और टेबल बनाएं। क्या कोई और चीज है जो मुझे याद आ रही है? कृपया मेरा मार्ग दर्शन कीजिए। – Milesh

0

निम्नलिखित कैसेंड्रा विन्यास जब यह अस्तित्व में नहीं है और यह भी चलाने के स्टार्ट-अप स्क्रिप्ट निर्दिष्ट

@Configuration 
@PropertySource(value = {"classpath:cassandra.properties"}) 
@EnableCassandraRepositories 
public class CassandraConfig extends AbstractCassandraConfiguration { 

    @Value("${cassandra.keyspace}") 
    private String cassandraKeyspace; 

    @Override 
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() { 
    return Collections.singletonList(CreateKeyspaceSpecification.createKeyspace(cassandraKeyspace) 
       .ifNotExists() 
       .with(KeyspaceOption.DURABLE_WRITES, true) 
       .withSimpleReplication()); 
    } 

    @Override 
    protected List<String> getStartupScripts() { 
    return Collections.singletonList("CREATE TABLE IF NOT EXISTS "+cassandraKeyspace+".test(id UUID PRIMARY KEY, greeting text, occurrence timestamp) WITH default_time_to_live = 600;"); 
    } 

}